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



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

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

忽略该句子的奇怪英语,我有一个情况,我需要匹配每个单词,但不包括标点符号,除非它是单词的一部分。所以我的结果应该是

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

  1. 我会(将'll与 I 匹配,因为它是单词的一部分)
  2. 失败
  3. 火柴
  4. 到期(跳过-)

    ">
  1. place(没有句号,因为它不是单词的一部分。

我设法想出了两个部分工作的正则表达式,但没有一个按照我想要的方式工作

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

这匹配普通单词,但不符合string's这样的情况,因为单词中有'。但是如果我用我的另一个表达方式:

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

它匹配string's但也-和句号在句子末尾,如place.

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

注意:除了给出的例子之外,我知道的标点符号既可以作为单词的一部分存在,也可以不包含-'().而仅是单词一部分的标点符号包括%$#&/任何其他标点符号都可以假设永远不会是任何单词的一部分。!?":应显示时带有或不带单词间距,但不得与结果匹配。

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

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

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

请参阅正则表达式演示。

详情

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

要仅匹配点作为小数分隔符,请添加额外的d*.?d+分支并从字符类中删除.

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

查看此正则表达式演示

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

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

但是Wiktor Stribiżew解决方案更好:

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

如果标点符号总是跟着没有单词的东西,比如逗号然后空格破折号然后空格,你可以只使用这个正则表达式W{2,}吗?

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

相关内容

最新更新