正则表达式:查找交替数字和字符串的模式

regex: Finding a pattern of alternating numbers and strings

我正在寻找以下模式:

(数字)(字符串)(数字)(字符串)(数字)(字符串)

至少有一组 (NUMBERS)(STRING) 个存在。我也想分别匹配数字和字符串。

示例:

1234abc234qwy2342nioo
23oin234noik32342noi
234nio234koi2341nio

我想要的输出如下:

  1. 1234、abc、234、qwy、2342、nioo
  2. 23, oin, 234, noik, 32342, noi

但是,如果输入只是一个数字,我不希望它与模式匹配。

我想出了以下正则表达式:

^(\d*)([a-z]*)(\d*)([a-z]*)(\d*)([a-z]*)$

Regex Example

但是,现在如果我也单独给它一个数字,它就会捕获。例如,它匹配以下模式:

2342324

有没有一种方法可以让正则表达式捕获至少一组 (NUMBERS)(STRINGS) 而不是单独匹配数字。

问题是您正在使用 *,这意味着零个或多个。换句话说,如果您使用 *,它本质上是可选的。 + 表示一个或多个,因此这更适合您的情况。例如:

^(\d+[a-z]+){1,3}$

或者,如果您想保留捕获组:

^(?:(\d+)([a-z]+)){1,3}$

或:

^(\d+)([a-z]+)(?:(\d+)([a-z]+))?(?:(\d+)([a-z]+))?$

可以使用正则表达式

/(?:(?<=\D)\d+|\d+(?=\D))|\D+/ 

这将仅匹配数字和非数字的交替子串,前提是该字符串至少包含一个非数字字符。如果字符串中只有数字,则不会进行匹配。如果至少有一个非数字字符,则将有一个或多个非数字匹配项和零个或多个数字匹配项。

我们可以通过以自由间距模式

编写正则表达式来使其自记录
/
(?:        # begin a non-capture group
  (?<=\D)  # next match is preceded by a non-digit character
  \d+      # match 1+ digits
  |        # or
  \d+      # match 1+ digits      
  (?=\D)   # previous match is followed by a non-digit character
)          # end non-capture group
|          # or
\D+        # match 1+ non-digit characters 
/x         # free-spacing regex definition mode

(?<=\D)积极的回顾(=\D) 正前瞻

此外,如果字符串仅包含非数字字符则不进行匹配,则正则表达式将更改为以下内容:

/(?:(?<=\D)\d+|\d+(?=\D))|(?:(?<=d)\D+|\D+(?=\d))/