正则表达式麻烦

时间:2011-08-12 21:44:31

标签: php regex

我正在尝试使用正则表达式,但由于我缺乏经验,我正在努力。我们的想法是扫描以'GB:'

开头的特定字符串

例如,它应该检测到:

  • GB:AB12ABC
  • GB:AB34 ABC

但不是:

  • US:AB12ABC
  • AB12ABC

我有这个正则表达式匹配我正在寻找的字符串(考虑到不同的空格,格式等):

/^([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})$/

但现在我想在前面添加GB:位。我在上面的表达式中会改变什么来做这个?

5 个答案:

答案 0 :(得分:4)

我会在第一个^之后添加GB:因为那是表示行开头的内容。

/ ^ GB:([AZ] {3} \ S(\ d {3} | \ d {2} | d {1})\ S [AZ]?)|([AZ] \ S? (\ d {3} | \ d {2} | \ d {1})\ S [AZ] {3})|(([A-HK-PRSVWY] [A-HJ-PR-Y])\ S([0] [2-9] | [1-9] [0-9])?\ S [A-HJ-PR-Z] {3})$ /

编辑:是的,我想有一个:那里。右邻。

答案 1 :(得分:3)

/^GB:([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})$/

让你的正则表达式说“以GB开头:然后......”

答案 2 :(得分:1)

声明的开头是:

^GB:([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})$

要记住的是像[A-Z]{3}这样的陈述,它会查找连续的3个大写字母,换句话说,它会查找模式,而不是您想要的完全匹配。

除非在GB:之后有特定的搜索内容,否则您可以将其缩短为^GB:.*$

答案 3 :(得分:1)

只需添加“GB:”,就像你可以减少你的表达一样:“(\ d {3} | \ d {2} | d {1})”只需“(\ d {1,3}} )”。

答案 4 :(得分:1)

应该能够像所有人所说的那样将GB:放在前面,但现有的正则表达式中存在错误。在自由间隔模式下更容易看到:

/^([A-Z]{3} \s? \d{1,3} \s? [A-Z])
  |
  ([A-Z] \s? \d{1,3} \s? [A-Z]{3})
  |
  ([A-HK-PRSVWY][A-HJ-PR-Y] \s? (?:0[2-9]|[1-9][0-9]) \s? [A-HJ-PR-Z]{3})$
/x

^锚仅影响第一个替代,而$仅影响第三个替代。你必须添加另一层遏制:

/^
 (?:
   ([A-Z]{3} \s? \d{1,3} \s? [A-Z])
   |
   ([A-Z]\s? \d{1,3} \s? [A-Z]{3})
   |
   ([A-HK-PRSVWY][A-HJ-PR-Y] \s? (?:0[2-9]|[1-9][0-9]) \s? [A-HJ-PR-Z]{3})
 )$
/x

...现在你可以添加前缀:

/^
 GB:
 (?:
   ([A-Z]{3} \s? \d{1,3} \s? [A-Z])
   |
   ([A-Z]\s? \d{1,3} \s? [A-Z]{3})
   |
   ([A-HK-PRSVWY][A-HJ-PR-Y] \s? (?:0[2-9]|[1-9][0-9]) \s? [A-HJ-PR-Z]{3})
 )$
/x

...或在线噪声模式下:

/^GB:(?:([A-Z]{3}\s?\d{1,3}\s?[A-Z])|([A-Z]\s?\d{1,3}\s?[A-Z]{3})|([A-HK-PRSVWY][A-HJ-PR-Y]\s?(?:0[2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3}))$/