我正在尝试创建一个正则表达式,该正则表达式选择一个关键字后的数字。 样本数据:
常用关键字是“合同”,此关键字后面是0到4个可能的非数字字符。然后,合同编号始终在7或8个数字之间。当数字更多时,不应选择它。 我从(?<= Contract)(。*)([0-9] +)开始 选择很多。我只需要数字,只有7或8位数字时才需要。
如果您有解决方案,也可以请您解释如何做,以便我可以学习。
结果应该是
答案 0 :(得分:1)
您可以使用quantifier指定数字位数和非数字位数,并使用负数lookahead来检查7或8位数字之后是否没有其他数字。
要匹配合同的所有变体,您可以使匹配大小写不敏感或匹配合同,例如[Cc]ontract
(?<=\b[Cc]ontract)\D{0,4}([0-9]{7,8})(?!\d)
这将匹配
(?<=\b[Cc]ontract)
,肯定会在左边声明合同或合同(如果您不想使用后面的搜索,也可以匹配\b[Cc]ontract
)\D{0,4}
匹配0-4次而不是数字([0-9]{7,8})
一次捕获7-8位数字(?!\d)
负向断言来断言以下内容不是数字.NET支持无限回溯。在这种情况下,您可以使用:
(?<=\b[Cc]ontract\D{0,4})[0-9]{7,8}(?!\d)
答案 1 :(得分:1)
您可以使用此正则表达式,
(?i)contract[^\d]{0,4}(\d{7,8})(?!\d)
说明:
(?i)
-在您拥有Contract
和其他contract
的地方启用不区分大小写的匹配contract
-与文本完全匹配[^\d]{0,4}
-匹配除数字外的任何字符0到4次(\d{7,8})
-匹配长度为7到8的数字(?!\d)
-如果前面有数字,则拒绝比赛答案 2 :(得分:0)
使用javascript:/contract(?!(\d{0-4}))(\d{7,8})(?!(\d))/i
“合约”,后跟任意0到4个非数字字符((?!(\d{0-4}))
表示长度在0到4之间且不包含数字的字符串),直到找到7或8个数字的序列({{ 1}}),下一个符号不是数字((\d{7,8})
)。 (?!(\d))
标记的装置,该正则表达式是不区分大小写的。
在我已经回答了我见过的问题是.NET相关。在c#中,您可以使用相同的模式(末尾的i
除外)并传递i
选项。
答案 3 :(得分:0)