用于在自由格式文本中匹配文档ID号的正则表达式

时间:2014-02-06 12:51:45

标签: regex

我必须在自由格式文本中匹配文档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 1ID 1/1

这是我到目前为止所得到的,但它不起作用:

ID(\s+|\s*:\s*)(?:[\p{L}0-9/-]*\s)*[0-9/-][\p{L}0-9/-]*

3 个答案:

答案 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]

如果匹配第二个正则表达式,那么你的句子不会遵循无序列“数字空格字母”条件,应该被拒绝。