^ : // Matches the beginning of the string
// or the beginning of a line if the multiline flag (m) is enabled.
[ ]* : // 0 or more spaces
[A-Z] : // an upper case ascii letter
[A-Z0-9]{0,3} : // between 0 and 3 upper case letters or digits
[ ] : // A character class with a space. Which matches 1 space.
// You don't actually need to put a single character in a character class.
// But here it's done to make the space stand out more.
[A-Z0-9]{1,3} : // Between 1 and 3 upper case letters or digits
$ : // Matches the end of the string
// or the end of a line if the multiline flag (m) is enabled.
2条答案
按热度按时间z5btuh9x1#
根据规范、示例以及您想要第一个示例的事实,即使在它之前有一个空格,似乎您需要像这样的正则表达式:
可以测试here
注意,^和$被添加到正则表达式中。但我有一种预感,您在某些工具或功能中使用正则表达式,这些工具或功能隐含地假设正则表达式需要匹配整行。因为否则您的原始正则表达式将匹配字符串“AA 1A 1AA”中的“AA 1A 1AA”。
如果是这种情况,^和$对于您的目的来说应该是多余的,您可以删除它们。
说明:
中间的空间没有放在捕获组
(...)
中。因为那样做的目的是什么?这并不像人们稍后会验证捕获组确实包含一个空格。如果你想在一个较长的字符串中搜索这些字符串,你可以使用单词边界来代替。
\B是单词边界,它指示单词字符[A-Za-z 0 -9_]和非单词字符之间的过渡。确保你的单词字符后面或后面有一个空格或行的开始或结束是很有用的。
例如,如果你有一个字符串“ABC DE”,那么正则表达式
/[A-Z]{2}/g
将匹配“AB”和“DE”。但是对于一个字边界/\b[A-Z]{2}\b/g
,它只能匹配“DE”,而不是像“AB”这样的单词的一部分。ccgok5k52#
你只需要优化你的第一个组来处理这两个:
/([A-Z]{1,2}|[A-Z0-9]{1,4})([ ]{1})([0-9A-Z]{1,3})/g
到
匹配项(粗体)从以下更改:
**AA1A 1AA
AA 12
11 AB
A 12
11A
1**
致:
**AA1A 1AA
AA 12
11 AB
A 12
11A
A 1
(注意11 AB和11 A是音符匹配的)