我正在尝试解析一个文本文档,其中包含一些带有下划线的单词。
我正在寻找正则表达式匹配,但目前失败了。
我正在查看(逐行(具有至少两个下划线的单词或至少具有两个下划线和正斜杠+至少三位数字的单词。
我已经到了
([a-zA-Z]+(?:_{2,}[a-zA-Z]+)*)
正确的匹配示例是
VOK17_05_530_526002 *(has atleast than two underscores)*
VIE_ROMS_002 *(has atleast than two underscores)*
VOK_OVSZ_001/002 *(has atleast two underscores and a forward slash + three digits)*
输入样本
VOK17_05_530_526002 502 504 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526002 401 401 LGCU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526002 510 513 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526002 515 515 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526003 503 506 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
我正在尝试我的正则表达式@https://regex101.com/r/yToVtc/1
如果有人能在这里帮忙,我将不胜感激。
您可以使用
b[A-Za-z0-9]+(?:_[a-zA-Z0-9]+)+(?:_[0-9]{3,})+(?:_[a-zA-Z0-9]+)*(?:/[0-9]+)?b
在部分
b
单词边界[A-Za-z0-9]+
匹配1+次列出的任何
次数(?:_[a-zA-Z0-9]+)+
重复 1+ 次下划线和 1+ 次列出的任何项(?:_[0-9]{3,})+
至少匹配第二个下划线和 3 个或更多数字(?:_[a-zA-Z0-9]+)*
重复 0+ 次和下划线以及列出的任何一项(?:/[0-9]+)?
匹配可选的/
和 1+ 位数字b
字界
正则表达式演示
使用这个:
b[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+){2,}(?:/d{3})?b
解释:
b # word boundary
[a-zA-Z0-9]+ # 1 or more alphanum
(?: # non capture group
_ # underscore
[a-zA-Z0-9]+ # 1 or more alphanum
){2,} # end group, must appear 2 or more times
(?: # non capture group
/ # a slask
d{3} # 3 digits
)? # end group, optional
b # word boundary
演示
至少有两个下划线的文本字符串的正则表达式
^[^_]*_[^_]*_.*$
^
- 比赛开始[^_]*
然后零到任意数量的字符,这些字符不是下划线_
然后是下划线[^_]*
然后零到任意数量的字符,这些字符不是下划线_
然后是下划线.*
然后从零到任意数量的字符$
- 比赛结束
下面的正则表达式使用前瞻断言来简化事情:
b(?=(?:([A-Za-z0-9]*_){2}))[A-Za-z0-9_]+(?:/d{3,})?b
b(?=(?:([A-Za-z0-9]*_){2}))
匹配单词边界当且仅当后跟([A-Za-z0-9]*_){2}
,也就是说,一个字符串包含 0 个或多个合法字母数字字符,后跟一个"_",全部重复两次。这是一个前瞻断言,可确保下面步骤 2 中的匹配项至少包含两个下划线字符。[A-Za-z0-9_]+
匹配合法字符一次或多次。(?:/d{3,})?
可选的正斜杠,后跟 3 位或更多数字。b
匹配单词边界。
查看演示
([^s]*_[^s]*){2,}
将匹配包含至少两个下划线的任何单词(任何没有空格的字符串(,方法是找到任意数量的非空格的两个集合组,一个下划线,无论如何,许多"单词"符号即将出现。
您可以将[^s]*
替换为您喜欢的"单词"的任何定义。
您还可以在第一个括号后添加?:
以避免捕获组。