首页 > 解决方案 > 正则表达式:匹配指定字符串后组合两个组

问题描述

文本字符串在以下配置中

RP0127630-001
NORTHWEST /
KMT

或者

RP0127630-001
NORTHWEST / KMT

我想返回的是:

1) 查找(?:[\w+]{2}\d{7}-\d{3}\r?\n)= 例如 RP0127630-001(始终采用这种格式,但数字可能会改变);然后

2)在一行字符串中返回NORTHWEST-KMT(不带空格和/转换为-)

如您所见,有时字符串在两行中,有时在一行中。我努力了:

(?:[\w+]{2}\d{7}-\d{3}\r?\n)\b(?<LineItem1Trip>(.*)\r?\n*(.*))\b

但是我无法将 / 转换为 - 并且有时也无法将两行合二为一。

标签: regex

解决方案


您可以使用您的第一个模式,添加匹配换行符上的第一个单词并在第 1 组中捕获它。然后/在空白字符之间匹配以下内容并在第 2 组中捕获以下单词。

然后在替换中使用-介于两者之间的 2 个捕获组。

(\w{2}\d{7}-\d{3}\r?\n\w+)\s*/\s*(\w+)

正则表达式演示

如果在替换中使用组不起作用,您可以使用环视(如果支持)并仅-在替换中使用:

(?<=\w{2}\d{7}-\d{3}\r?\n\w+)\s*\/\s*(?=\w+)

正则表达式演示

输出

RP0127630-001
NORTHWEST-KMT

RP0127630-001
NORTHWEST-KMT

请注意,在您尝试的模式中,这部分[\w+]{2}\w可以匹配数字或下划线,而不仅仅是大写字符A-Z

+字符类中的 char 可以从字面上匹配 char 。


推荐阅读