我需要匹配字符串中可能带有符号的单词,既在单词中,也作为标点符号。示例字符串可以是:
This string's is a good example of situation I'll fail to match - due to punctuations being all over the place.
忽略该句子的奇怪英语,我有一个情况,我需要匹配每个单词,但不包括标点符号,除非它是单词的一部分。所以我的结果应该是
- 这
- 字符串(匹配
's
,因为它是单词的一部分) - 是
- 一个
- 好
。
- 我会(将
'll
与 I 匹配,因为它是单词的一部分) - 失败
- 自
- 火柴
- 到期(跳过
-
) - 自
。
- ">
- 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 次到无限次之间的匹配