我有以下正则表达式:
^([A-Za-z]{2,3}\d{6}|\d{5}|\d{3})((\d{3})?)(\d{2}|\d{3}|\d{6})(\d{2}|\d{3})$
我使用这个正则表达式来匹配不同但相似的字符串:
# MOR644-004-007-001
MOR644004007001 # string provided
# VUF00101-050-08-01
VUF001010500801 # string provided
# MF001317-077944-01
MF00131707794401 # string provided
这些字符串需要匹配/分组,因为它位于字符串的顶部,但我的问题是它没有正确分组
第一个字符串:MOR644004007001
已分组:(MOR644004) (007) (001)
应为(MOR644) (004) (007) (001)
第二个字符串:VUF001010500801
已分组(VUF001010) (500) (801)
,应为(VUF00101) (050) (08) (01)
如何更改([A-Za-z]{2,3}\d{6}|\d{5}|\d{3})((\d{3})?)
以便正确分组提供的字符串?
答案 0 :(得分:2)
我不确定你能做你想做的事。 让我们考虑前两个字符串:
# MOR644-004-007-001
MOR644004007001 # string provided
# VUF00101-050-08-01
VUF001010500801 # string provided
现在,两个字符串都由3个字符组成,后跟12个数字。因此,给定正则表达式 R ,如果 R 不依赖于特定(序列)字符和特定(序列)数字(即,它呈现{{1} }和[A-Za-z]
但不会出现,假设\d
和MO
),那么它将以相同的方式匹配两个字符串。
因此,如果您想要操作不同的匹配,那么您需要查看某些字符或数字的特定匹配项。我们需要您提供更多数据,以便为您提供支持。
最后,我建议你看看这个工具:
http://regex.inginf.units.it/(演示:http://regex.inginf.units.it/demo.html)。这是一个研究项目,自动生成一个正则表达式(给定(很多)提取的例子)。我热烈建议你尝试一下,特别是如果你知道你的情况下确实存在一个基础模式(即以0070
开头的字符串必须与以VUF
开头的字符串不同,但你是无法找到它。同样,您需要为引擎提供许多示例。有人说,如果不存在通用模式,那么该工具将无法找到它;)
答案 1 :(得分:1)
考虑到您对Serv的评论我说(唯一?)解决方案是为每种可能性设置一个正则表达式,例如 -
MOR(\d{3})(\d{3})(\d{3})(\d{3})|VUF(\d{5})(\d{3})(\d{2})(\d{2})|MF(\d{6})(\d{6})(\d{2})
然后使用执行环境(JS / php / python - 你还没有提供哪一个)将部分拼凑在一起。
请参阅regex101 here上的示例。请注意,替换仅作为示例,仅匹配第二个字符串。
此致
答案 2 :(得分:0)
看看这个。我使用了被称为命名组的东西。正如其他人早先指出的那样,为每个字符串设置一个正则表达式代码会更好。我在这里显示了第一个字符串MOR644004007001
。您可以轻松扩展其他两个字符串:
import re
# MOR644-004-007-001
MOR = "MOR644004007001" # string provided
# VUF00101-050-08-01
VUF = "VUF001010500801" # string provided
# MF001317-077944-01
MF = "MF00131707794401" # string provided
MORcompile = re.compile(r'(?P<first>\w{,6})(?P<second>\d{,3})(?P<third>\d{,3})(?P<fourth>\d{,3})')
MORsearch = MORcompile.search(MOR.strip())
print MORsearch.group('first')
print MORsearch.group('second')
print MORsearch.group('third')
print MORsearch.group('fourth')
MOR644
004
007
001