我正在尝试编写一个正则表达式,它可以从字符串中提取不同类型的字符串+数字+符号组合。我想要提取的字符串类型是:
avs-tldr-02
cc+asede
x86_64
我正在测试的边缘情况的类型是这些字符串出现在句子的开头,中间和结尾处:
avs-tldr-02 this is a test
cc+asede this is a test
x86_64 this is a test
this is a test avs-tldr-02 this is a test
this is a test cc+asede this is a test
this is a test x86_64 this is a test
this is a test avs-tldr-02
this is a test cc+asede
this is a test x86_64
基于this出色的答案,我已经考虑过"环顾四周" RegEx中的断言并提出以下内容:
(?=.*[:alnum:])(?=.*[:punct:])([a-zA-Z0-9_-]+)
但是,这会保持匹配字符串的第一个单词 - 我理解为什么会发生这种情况,但我不知道如何调整它以适应我的用例。
如何修改此内容以获取我正在寻找的内容?还有其他方法可以解决此问题吗?
答案 0 :(得分:3)
我使用了这个正则表达式
/([^\s]+?[-_+][^\s]+)/g
我不熟悉 r ,但经过测试的正则表达式很好看! https://regex101.com/r/Sxully/1
注意:在“”或“”中实现给定的正则表达式时,请注意反斜杠和\\
,这取决于语言和用法
如果你想接受'_word_starting_by_underline'使用这个正则表达式:(它不会有用:))
/([^\s]*?[-_+][^\s]+)/g
// ^^^^ + changed to * to support nothing before [-_+]
答案 1 :(得分:2)
您的模式有几个问题。像[:alnum:]
或[:punct:]
这样的POSIX字符类必须位于括号表达式中,以便进行解析。另一件事是.*
匹配任何char(PCRE正则表达式中的换行符除外),因此会导致超匹配,因为如果前瞻模式被发现更远,它将返回true在字符串中比你期望的那样。
我建议使用
(?=[[:punct:]]*[[:alnum:]])(?=[[:alnum:]]*[[:punct:]])[[:alnum:][:punct:]]+
请参阅regex demo
<强>详情:
(?=[[:punct:]]*[[:alnum:]])
- 在当前位置,必须有0+个标点符号,后面跟一个字母数字字符(?=[[:alnum:]]*[[:punct:]])
- 在当前位置(与上面相同,前瞻是不使用文本的零宽度断言),必须有0+个字母数字字符后跟一个标点符号[[:alnum:][:punct:]]+
- 一个或多个字母数字或标点字符。如果在比赛的开始/结束时需要字母数字字符,则可以在两端添加单词边界(\b
)。