RegEx从字符串中提取字母数字+符号组合

时间:2017-02-28 21:43:51

标签: r regex

我正在尝试编写一个正则表达式,它可以从字符串中提取不同类型的字符串+数字+符号组合。我想要提取的字符串类型是:

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_-]+)

但是,这会保持匹配字符串的第一个单词 - 我理解为什么会发生这种情况,但我不知道如何调整它以适应我的用例。

如何修改此内容以获取我正在寻找的内容?还有其他方法可以解决此问题吗?

2 个答案:

答案 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)。