regex 带有必需字符的正则表达式IF/Then

myzjeezk  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(260)

我对正则表达式还很陌生,对下面的表达式感到很困惑。我正在寻找一个regex代码,允许以下组合:

AA1A 1AA
AA 12
A 12
A 1

要求:

  • 字符串不能以数字开头
  • 仅大写字母(A-Z)
  • 在预定位置需要1个空间(参见上述示例)
  • 数字0-9可以使用

我目前正在处理以下字符串
([A-Z]{1,2}|[A-Z0-9]{1,4})([ ]{1})([0-9A-Z]{1,3})
这个问题是它不允许AA1A 1AA字符串。
有什么想法吗

z5btuh9x

z5btuh9x1#

根据规范、示例以及您想要第一个示例的事实,即使在它之前有一个空格,似乎您需要像这样的正则表达式:

^[ ]*([A-Z][A-Z0-9]{0,3})[ ]([A-Z0-9]{1,3})$

可以测试here
注意,^和$被添加到正则表达式中。但我有一种预感,您在某些工具或功能中使用正则表达式,这些工具或功能隐含地假设正则表达式需要匹配整行。因为否则您的原始正则表达式将匹配字符串“AA 1A 1AA”中的“AA 1A 1AA”。
如果是这种情况,^和$对于您的目的来说应该是多余的,您可以删除它们。
说明:

^ :     // 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.

中间的空间没有放在捕获组(...)中。因为那样做的目的是什么?这并不像人们稍后会验证捕获组确实包含一个空格。
如果你想在一个较长的字符串中搜索这些字符串,你可以使用单词边界来代替。

\b([A-Z][A-Z0-9]{0,3})[ ]([A-Z0-9]{1,3})\b

\B是单词边界,它指示单词字符[A-Za-z 0 -9_]和非单词字符之间的过渡。确保你的单词字符后面或后面有一个空格或行的开始或结束是很有用的。
例如,如果你有一个字符串“ABC DE”,那么正则表达式/[A-Z]{2}/g将匹配“AB”和“DE”。但是对于一个字边界/\b[A-Z]{2}\b/g,它只能匹配“DE”,而不是像“AB”这样的单词的一部分。

ccgok5k5

ccgok5k52#

你只需要优化你的第一个组来处理这两个:

  • 两个字母(AA)
  • 两个字母和字母和数字(AA 1A)

/([A-Z]{1,2}|[A-Z0-9]{1,4})([ ]{1})([0-9A-Z]{1,3})/g

/([A-Z]{1,2}|[A-Z]{2}[A-Z0-9]{2})([ ]{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是音符匹配的)

相关问题