使用 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 忽略分隔符前的特定字符的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词