正则表达式:查找交替数字和字符串的模式
regex: Finding a pattern of alternating numbers and strings
我正在寻找以下模式:
(数字)(字符串)(数字)(字符串)(数字)(字符串)
至少有一组 (NUMBERS)(STRING) 个存在。我也想分别匹配数字和字符串。
示例:
1234abc234qwy2342nioo
23oin234noik32342noi
234nio234koi2341nio
我想要的输出如下:
- 1234、abc、234、qwy、2342、nioo
- 23, oin, 234, noik, 32342, noi
但是,如果输入只是一个数字,我不希望它与模式匹配。
我想出了以下正则表达式:
^(\d*)([a-z]*)(\d*)([a-z]*)(\d*)([a-z]*)$
但是,现在如果我也单独给它一个数字,它就会捕获。例如,它匹配以下模式:
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))/
我正在寻找以下模式:
(数字)(字符串)(数字)(字符串)(数字)(字符串)
至少有一组 (NUMBERS)(STRING) 个存在。我也想分别匹配数字和字符串。
示例:
1234abc234qwy2342nioo
23oin234noik32342noi
234nio234koi2341nio
我想要的输出如下:
- 1234、abc、234、qwy、2342、nioo
- 23, oin, 234, noik, 32342, noi
但是,如果输入只是一个数字,我不希望它与模式匹配。
我想出了以下正则表达式:
^(\d*)([a-z]*)(\d*)([a-z]*)(\d*)([a-z]*)$
但是,现在如果我也单独给它一个数字,它就会捕获。例如,它匹配以下模式:
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))/