我必须在自由格式文本中匹配文档ID。文本已经分为句子或行,每行最多只有一个ID号。 ID可以有不同的格式,可以包含空格,所以一般我想匹配:
表示ID跟随的单词(假设它始终为“ID”)
一些空格/标点符号(让我们假设它至少有一个空格或一个用可选空格包围的冒号)
任何字母,数字,斜线和连字符的序列,可选地包含空格,但(现在是捕获)其中没有序列“digit-space-letter”(因为通常这意味着该字母属于ID后面的单词;序列“letter-space-letter”不明确,但通常发生在ID中,所以我希望它匹配)
例如,我想匹配:
ID: 1
ID 1/1
ID : 1/A
ID AAA X1
ID :B/B
ID 1/ A
ID 1 /A
ID 1 /A/ AA
ID 1 /A /AA
ID AA 123
ID AA 123 123
ID AA/123 123
但不是
ID 1 AAA
ID 1/1 AAA
在上述两种情况下,我想分别只匹配ID 1
和ID 1/1
。
这是我到目前为止所得到的,但它不起作用:
ID(\s+|\s*:\s*)(?:[\p{L}0-9/-]*\s)*[0-9/-][\p{L}0-9/-]*
答案 0 :(得分:0)
正则表达式:
ID(?: *: *| +)(?:(?!\d\s+[a-zA-Z])[\da-zA-Z/\s])*\d?
可能会成功。
ID(?: *: *| +)
匹配ID
后跟空格和:
(最多一个:
)的组合。之后我们就进入好的部分,正则表达式引擎将尝试逐个匹配字符:
(?!\d\s+[a-zA-Z])
检查我们是不是数字后跟空格和字母。如果我们是,我们停下来,我们抓住最后一位数\d?
。如果我们不是,这意味着我们可以将角色与[\da-zA-Z/\s]
匹配。然后我们传递以下字符并执行相同的检查,直到我们到达行尾或特殊字符。
答案 1 :(得分:0)
好的,感谢提示,我终于自己解决了这个问题:
ID(?: +| *: *)((?:[0-9](?:\s+(?![a-zA-Z]))?|[A-Za-z/]\s*)*)
在每个非空白字符之后,我尝试匹配空格,但在一个数字之后,我匹配可选空格,条件是这些空格后面没有字母。
答案 2 :(得分:-1)
这是我编辑过的解决方案:
您可以使用两个正则表达式:
第一:
ID[\s:]+[\da-zA-Z\s/-]*
它匹配ID
后跟空格或逗号,其中至少有一个。
然后[\da-zA-Z\s/-]*
部分将匹配任何数字,字母,空格,斜杠和连字符序列。
这样可以确保你的句子符合想要的模式。
附加条件是使用第二个正则表达式完成的:
\d [a-zA-Z]
如果匹配第二个正则表达式,那么你的句子不会遵循无序列“数字空格字母”条件,应该被拒绝。