使用C#的Regex.Split,我有一个在单词之间找到分隔符的正则表达式:
[\b\s\p{P}]+
在“示例文字。另一个:字”上工作,并生成:示例 | 文字 | 另一个 |的字即可。太好了!
在“单词120,000另一个单词”上,它会产生:单词 | 120 | 000 | 另一个 |的字即可。不是很好!
如何更改正则表达式以使数字内的逗号不匹配?即, 120,000 不会破坏?
答案 0 :(得分:1)
我相信你会发现,随着额外要求的出现,使用Regex.Split
这样做只会变得更加复杂。您可能会发现最好使用Regex.Match
来反向(识别“整个单词”而不是逻辑“单词边界”)。
原因如下:
((?<=\p{L})\p{P}(?=\p{L}))|(\p{Z}|(?<=[\p{Z}\p{P}])\p{P}|\p{P}(?=[\p{Z}\p{P}]))+
不漂亮,所以我们来解释一下。首先,我已将\s
替换为\p{Z}
类(可见/不可见的空格),因为为什么不呢。其次,这个正则表达式匹配四个不同的东西:
(?<=\p{L})\p{P}(?=\p{L})
这匹配夹在字母之间的标点符号。需要与:
中的another:word
匹配。它也是+
量词不适用的唯一子模式(没有意义)。正面外观用于断言字母的存在,但避免匹配它们。
\p{Z}
这匹配一个空格序列。所有这些序列都会导致分裂。
(?<=[\p{Z}\p{P}])\p{P}
这匹配标点符号,前面带有标点符号或空格以外的任何内容,使用正向lookbehind。
\p{P}(?=[\p{Z}\p{P}])
这与上述相反:它匹配标点符号,后跟标点符号或空格以外的任何内容。
由于100,000
中的逗号与上述任何一个都不匹配,因此此正则表达式不会拆分该标记。但是你可以看到它的发展方向:不是指定你想要的符号作为一个标记保存在一起,而是使用Regex.Split
,你必须指定......其他所有。
答案 1 :(得分:0)
试试这个:
(([\s\p{P}](?!\d))|((?<!\d)[\s\p{P}]))+
上半场
([\s\p{P}](?!\d))
匹配任何未跟随数字的分隔符和第二个分隔符 - 任何分隔符,不跟随数字。