使用 RegEx 忽略分隔符前的特定字符

Posted

技术标签:

【中文标题】使用 RegEx 忽略分隔符前的特定字符【英文标题】:Ignore specific characters before a delimiter with RegEx 【发布时间】:2022-01-22 03:02:30 【问题描述】:

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

重要的是要提一下

国家 与其他国家/地区(第一个字母)分开的分隔符始终是 * (asterisk) or a - (hyphen) 分隔 与右侧其他字符的分隔符始终为 a - (hyphen) 区还可以包含ä,ö,ü等字母

车牌如下所示:

A*S-XXXPA
A*SL-XXXPC
A*SL-XXXSD
A*HA-XXXHV
D*R-XXXXX
D*TS-XXXXX
A*VB-1XXXXX

我用来捕捉国家和地区的正则表达式如下。

String country = "^([A-Z]1,3)";
String district = "\\h*(\\pL1,3)[-*]";

一旦我从我的字符串中获得了所需的信息,我就会使用 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+$", "");            

    

我捕获国家/地区的正则表达式工作正常,这是一个示例:

https://regex101.com/r/jfhSJN/1

我遇到麻烦的是我用来捕获地区的 RegEx。目前它还赶上了国家...

https://regex101.com/r/57ZE9O/1

我想我可以删除 RegEx 末尾的星号,但我认为这不是最干净的方法。

谢谢!

【问题讨论】:

【参考方案1】:

地区正则表达式的主要问题是\h* 匹配任何零个或多个水平空格。所以匹配也可以出现在字符串的开头。

由于您想在水平空格后得到匹配,*-,您可以使用

[*\h-](\pL1,3)[-*]

请参阅regex demo。这里,[*\h-] 匹配 *、水平空格或 - 字符。

但是,在将所有部分捕获到组中时,使用正则表达式来匹配搅拌是有意义的:

^([A-Z]1,3)[\h*-](\pL1,3)[-*](.+)

见this regex demo。 详情

^ - 字符串开头 ([A-Z]1,3) - 第 1 组:一个、两个或三个大写字母 [\h*-] - 水平空格,*- (\pL1,3) - 第 2 组:一到三个任意 Unicode 字母 [-*] - -* 字符 (.+) - 第 3 组:直到字符串/行结尾的所有文本。

【讨论】:

嗨@Wiktor Stribiżew - 非常感谢您的精彩解释和回答。就我而言,我明确希望在没有组的情况下工作,以防止 Java 代码发生变化。仅对地区来说可能吗? @Djabone 是的,请参阅 (?<=[*\h-])\pL1,3(?=[-*]) demo here。 如果我做得好,请告诉我好吗? (?<=[*\h-]) positive lookbehind - searches for - but only if there's a * before it? \pL1,3 matches any letter from any language between 1 and 3 characters. ?=[-*] lost me here。非常感谢您的帮助 @Djabone No. (?<=[*\h-]) - 需要*- 或hor 的正向前瞻。当前位置左侧的空格。您正确理解\pL1,3(?=[\h-]) 是一个积极的前瞻,需要一个 hor.空格或- 紧挨当前位置的右侧。

以上是关于使用 RegEx 忽略分隔符前的特定字符的主要内容,如果未能解决你的问题,请参考以下文章

使用 RegEx 解析具有复杂分隔符的字符串

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

按分隔符拆分字符串并跳过分隔符后跟某些字符的部分

C# 使用 Regex.Split 拆分大字符串。必须保留分隔符

如何保留 Regex.Split 的分隔符?

Java Regex在分隔符和保留分隔符之间拆分字符串[重复]