正则表达式匹配单词与标点符号,但不单独标点符号

时间:2017-02-03 07:48:03

标签: regex swift

我需要匹配可能包含符号的字符串中的单词,在单词中也可以作为标点符号。示例字符串可以是:

This string's is a good example of situation I'll fail to match - due to punctuations being all over the place.

忽略那句话的奇怪英语,我有一个案例,我需要匹配每个单词而不是标点符号,除非它是单词的一部分。所以我的结果应该是

  1. string' s(匹配's,因为它是单词的一部分)
  2. 一个
  3. ...

    1. 我('ll与我匹配,因为它是该词的一部分)
    2. 失败
    3. 匹配
    4. 到期(跳过-
    5. ...

      1. 地方(没有完全停止,因为它不是单词的一部分。)
      2. 我设法提出了两个部分工作的正则表达式,但它们都没有按照我想要的方式工作

        (?<=\\s|^)[A-Za-z0-9]+?(?=\\s|$) - I am using swift so `\\s` is for whitespace
        

        这与普通单词匹配,但不匹配string's之类的情况,因为单词中有'。但如果我使用我的另一个表达式:

        (?<=\\s|^).+?(?=\\s|$)
        

        它与string's匹配,但-匹配,place.

        等句子末尾的句号

        是否有一个表达式匹配带标点符号的单词而不是单独的标点符号?我不介意它是否需要多个表达式来捕获所有结果,我可以在显示之前合并结果。

        注意:除了给出的示例,我知道的标点符号可以作为单词的一部分存在,包括- ' () .,而标点符号则会只有一个单词的一部分包括% $ # & /任何其他标点符号都可以假定为永远不会成为任何单词的一部分。 ! ? " :预计会出现与单词间隔或不出现但不得与结果匹配的情况。

        幸运的是,字符串可以安全地假设只包含字母数字和标点符号 - 其他语言字符和符号如<>{}[]|+*=可以假设不出现在字符串中 - 还有其他一些符合我现在无法预测的四组符号之一的符号,但我相信如果我能得到一个有效的逻辑,我可以调整它以在每组中包含更多符号。

3 个答案:

答案 0 :(得分:3)

您似乎需要一个能够匹配选定符号的正则表达式,这些符号位于&#34; word&#34;之前或之后。字符,或只是字母/数字或括号字母/数字。所有这些都应该在空格内,字符串位置的开始/结束或字边界(注意这个顺序很重要)。

使用

(?<=\\s|^|\\b)(?:[-'.%$#&/]\\b|\\b[-'.%$#&/]|[A-Za-z0-9]|\\([A-Za-z0-9]+\\))+(?=\\s|$|\\b)

请参阅regex demo

<强>详情:

  • (?<=\\s|^|\\b) - 一个正向的后视镜,要求必须有空格,或者在当前位置左侧开始字符串或字边界
  • (?: - 启动非捕获组,匹配以下1个序列:
    • [-'.%$#&/]\\b - 指定的符号后跟单词char
    • | - 或
    • \\b[-'.%$#&/] - 前面带有单词char
    • 的指定符号
    • | - 或
    • [A-Za-z0-9] - 字母数字
    • | - 或
    • \\([A-Za-z0-9]+\\) - 一个(,后跟一个以上的字母数字符号和一个)
  • )+ - 非捕获组的结束
  • (?=\\s|$|\\b) - 一个积极的前瞻,要求在当前位置的右侧必须有空格,字符串结尾或字边界。

要仅将点匹配为小数分隔符,请添加其他\d*\.?\d+分支并从字符类中取出.

(?<=\\s|^|\\b)(?:[-'%$#&/]\\b|\\b[-'%$#&/]|\\d*\\.?\\d+|[A-Za-z0-9]|\\([A-Za-z0-9]+\\))+(?=\\s|$|\\b)

请参阅this regex demo

答案 1 :(得分:2)

假设一个单词中最多有一个标点符号,您可以尝试:

(?<=\\s|^) ([A-Za-z0-9]+? | [A-Za-z0-9]*?[\-\'\(\)\.\%\$\#\&\/][A-Za-z0-9]*? ) (?=\\s|$) 

但WiktorStribiżew解决方案更好:

(?<=\\s|^|\\b)(?:[-'.%$#&/]\\b|\\b[-'.%$#&/]|[A-Za-z0-9]|\\(‌​[A-Za-z0-9]+\\))+(?=‌​\\s|$|\\b)

答案 2 :(得分:0)

如果标点符号总是跟不上像昏迷然后空格破折号然后空格这样的单词,你可以使用这个正则表达式TestFragment f2 = TestFragment.newInstance(); f2.setText = "222" 吗?

注意: \ W匹配任何非单词字符(等于[^ a-zA-Z0-9_]) {2,}量词 - 2和无限次之间的匹配