【问题标题】:How can I capture specific characters before a delimiter using RegEx?如何使用 RegEx 在分隔符之前捕获特定字符?
【发布时间】:2021-11-24 05:11:19
【问题描述】:

我正在尝试创建两个正则表达式来捕获欧洲车牌所需的字符。

我目前正在使用两个正则表达式

  1. 占领国家
    • (^[A-Z]{1,3}[\\s])
  2. 占领区
    • (([^\\s*-A-Z]{1,3}[*])|([^\\s*-A-Z]{1,3}[-]))

以下是我拥有的车牌格式示例:

D HG-ABCDE : Country should be D, District should be HG
A S-FGHIJ  : Country should be A, District should be S 
D AC-KLMNO : Country should be D, District should be AC
A BR-PQRST : Country should be A, District should be BR
A RO*UVWXY : Country should be A, District should be RO

一旦我从我的字符串中获得了所需的信息,我就会使用 java 代码删除我不需要的信息,这是代码片段:

if (matcher.find()) {
        
        country_region = matcher.group(1);
        country_region = country_region.replace("*", "");
        country_region = country_region.replace("-", "");
        country_region = country_region.replaceAll("\\s+$", "");            

    }

现在我已经解释了我的主题,这就是我遇到的问题。 我的 District RegEx 没有按预期工作,它选择了错误的字母,然后导致我这边的映射错误。不幸的是,我找不到我的错误,我在这里寻求帮助!

我如何重写我的地区正则表达式以检索字母在分隔国家和地区的空格之后但在分隔符 * 或 - 之前?

非常感谢!

【问题讨论】:

    标签: regex regex-group


    【解决方案1】:

    字符类[^\\s*-A-Z] 是一个否定字符类,它匹配除所列字符之外的任何字符。这部分 \\s*-A 表示 ASCII 十进制数字 42-65 的范围,也不会匹配 A 字符。

    如果您将其更改为[\s*A-Z-]{1,3},它仍然会匹配一个空格和一个连字符匹配太多。


    您可以使用 2 个捕获组,其中国家在第 1 组中,而地区在第 2 组中。

    要匹配-*,您可以使用字符类[-*]

    ^([A-Z]{1,3})\h+([A-Z]{1,3})[-*][A-Z]{5}$
    

    模式匹配:

    • ^ 字符串开始
    • ([A-Z]{1,3})组 1 中捕获 1-3 次出现的 A-Z
    • \h+ 匹配 1+ 个出现的水平空白字符
    • ([A-Z]{1,3})组 2 中捕获 1-3 次出现的 A-Z
    • [-*][A-Z]{5} 匹配 -* 并出现 5 次 A-Z
    • $字符串结束

    在 Java 中

    String regex = "^([A-Z]{1,3})\\h+([A-Z]{1,3})[-*][A-Z]{5}$";
    

    查看regex demo

    仅捕获前 2 组,末尾没有字符并以单词边界开头:

    \b([A-Z]{1,3})\h+([A-Z]{1,3})[-*]
    

    Regex demo

    【讨论】:

    • 非常感谢。为了避免重写我的整个 java 部分,我怎么能只在一个正则表达式(国家)中捕获第一组,而在另一个正则表达式中捕获第二组(地区)?
    • @Djabone 那么这可能是第一部分 ^([A-Z]{1,3}) 这可能是第二部分 \\h([A-Z]{1,3})[-*]
    • 谢谢你,他们的工作就像一个魅力。在java中将那些RegEx重写为Strings有什么语法差异吗?
    • @Djabone 在 Java 中,您必须对反斜杠进行双重转义。
    • 谢谢!在某些情况下,也可能是我有格式,例如某些地区可能看起来像 LöN 或 DüS - 我该如何面对?
    猜你喜欢
    • 2022-01-22
    • 2019-02-10
    • 2018-03-05
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多