使用正则表达式,我想选择仅在字其中:
我对正则表达式不是很满意,但是到目前为止,我已经尝试过[^\d\s]*(\d+)(?!.*\1)
,使我无法接近所需的输出:(
以下是输入字符串:
I would like abc123 to match but not 123.
ab12s should also match
Only number-words like 1234 should not match
Words containing same numbers like ab22s should not match
234 should not match
hel1lo2haha3hoho4
hel1lo2haha3hoho3
预期匹配:
abc123
ab12s
hel1lo2haha3hoho4
答案 0 :(得分:8)
您可以使用
\b(?=\d*[a-z])(?=[a-z]*\d)(?:[a-z]|(\d)(?!\w*\1))+\b
https://regex101.com/r/TimjdW/3
锚的开始和在字边界的图案的端部\b
,则:
(?=\d*[a-z])
-在单词中的某个位置前瞻字母字符(?=[a-z]*\d)
-在单词中的某个地方先行查找数字(?:[a-z]|(\d)(?!\w*\1))+
重复匹配:
[a-z]
-任何字母字符,或(\d)(?!\w*\1)
- 其不以相同的字再次发生一个数字答案 1 :(得分:3)
由于它不会为每个字符断定负前瞻,因此使用了更短,更快的正则表达式来实现它:
/\b(?=[a-z]*\d)(?=\d*[a-z])(?!\w*(\d)\w*\1)[a-z\d]+\b/ig
RegEx详细信息:
\b
:单词边界(?=[a-z]*\d)
:确保我们至少有一位数字(?=\d*[a-z])
:确保我们至少有一封信(?!\w*(\d)\w*\1)
:确保单词中的任何地方都不会重复数字[a-z\d]+
:匹配1个以上的字母数字\b
:单词边界答案 2 :(得分:2)
您可以使用一个否定的前瞻断言所有条件:
\b(?![a-z]+\b|\d+\b|\w*(\d)\w*\1)[a-z\d]+\b
重要的部分是从\b
开始比赛,然后立即寻找条件:
[a-z]+\b
仅字母
\d+\b
仅数字
\w*(\d)\w*\1
有重复的数字
答案 3 :(得分:1)
您可以使用
\b(?!\w*(\d)\w*\1)(?=(?:[a-z]+\d+)|(?:\d+[a-z]+))[a-z0-9]+\b
\b
-单词边界。(?!\w*(\d)\w*\1)
-检查唯一数字的条件。(?=(?:[a-z]+\d+)|(?:\d+[a-z]+))
-检查字母数字单词的条件。[a-z0-9]+
-匹配a to z
和0 to 9