用于分隔符的正则表达式,数字除外

时间:2012-07-11 10:49:43

标签: c# regex

使用C#的Regex.Split,我有一个在单词之间找到分隔符的正则表达式:

[\b\s\p{P}]+

在“示例文字。另一个:字”上工作,并生成:示例 | 文字 | 另一个 |的即可。太好了!
在“单词120,000另一个单词”上,它会产生:单词 | 120 | 000 | 另一个 |的即可。不是很好!

如何更改正则表达式以使数字内的逗号不匹配?即, 120,000 不会破坏?

2 个答案:

答案 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}类(可见/不可见的空格),因为为什么不呢。其次,这个正则表达式匹配四个不同的东西:

#1:(?<=\p{L})\p{P}(?=\p{L})

这匹配夹在字母之间的标点符号。需要与:中的another:word匹配。它也是+量词不适用的唯一子模式(没有意义)。正面外观用于断言字母的存在,但避免匹配它们。

#2:\p{Z}

这匹配一个空格序列。所有这些序列都会导致分裂。

#3:(?<=[\p{Z}\p{P}])\p{P}

这匹配标点符号,前面带有标点符号或空格以外的任何内容,使用正向lookbehind。

#4:\p{P}(?=[\p{Z}\p{P}])

这与上述相反:它匹配标点符号,后跟标点符号或空格以外的任何内容。

由于100,000中的逗号与上述任何一个都不匹配,因此此正则表达式不会拆分该标记。但是你可以看到它的发展方向:不是指定你想要的符号作为一个标记保存在一起,而是使用Regex.Split,你必须指定......其他所有。

答案 1 :(得分:0)

试试这个:

(([\s\p{P}](?!\d))|((?<!\d)[\s\p{P}]))+

上半场

 ([\s\p{P}](?!\d)) 

匹配任何未跟随数字的分隔符和第二个分隔符 - 任何分隔符,不跟随数字。