1

有一些我需要分解单个单词的文本文件。但是对单词的定义非常宽松。

\b似乎正确识别边界,但由于它是零宽度 ^\b 不做任何事情。

我知道 .NET string.parse 可能更快,但我也需要匹配位置。

我最终得到的结果如下所示。当我想打破非零时 ^ 。添加了希望忽略中断的日期、电子邮件和 URL。

我知道该解决方案与我最初的问题陈述不是很接近。它进化了。谢谢大家的帮助。

    String line;
pattern = @"\w+@\w+|[01]?\d\/[0123]?\d\/([12]\d)?\d\d|https?:\/\/(?:\w+\.){1,3}\w+|[^\s\.\\///?!()@,]{2,200}";
    while ((line = sr.ReadLine()) != null)
    {
        Debug.WriteLine(line);
        foreach (Match match in Regex.Matches(line, pattern, RegexOptions.IgnoreCase))
        {
            Debug.WriteLine(match.Index.ToString() + " " + match.Value);
        }
        break;
    }
4

5 回答 5

1

您需要准确了解\b它的作用。请记住,正则表达式无法读取;“单词边界”中的“单词”任意定义为一个或多个字母、数字或下划线。如果你的定义不同,\b是没用的。

那么你到底认为一个词是什么?查看您更新的问题,我仍然看不到可用的模式。您只想拆分空格和句点吗?

pattern = @"(?<=^|[\s.])[^\s.]+(?=[\s.]|$)";

应用于您的测试字符串:

MSCFX package.propertiescu3u bin\exet[p"R`4~fd

...它匹配:

MSCFX
package
propertiescu3u
bin\exet[p"R`4~fd
于 2012-05-30T20:16:43.957 回答
1

根据RegexHero

([^\\b]*)

使用忽略大小写,单行MSCFX package.propertiescu3u bin\exet[p"R``4~fd

在此处输入图像描述

于 2012-05-30T20:21:30.380 回答
1

没有一个单词边界\B会指代相同同类的相邻项目,无论是单词还是非单词。

你似乎想要\b(\w+|\W+)\b,因为((?:\B.\B)+)会留下相同的结尾字符。

编辑:

你更新..

You could split with this [^\p{L}] *\p{Z} [^\p{L}]* or use  

(dosen't account for graphines) 
[\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]) )* )
  or
[\s[:punct:]]* (\w (?: \w | [[:punct:]](?=[\w[:punct:]]) )* )  

两者都产

'hello'
'world'
'MSCFX'
'package.propertiescu3u'
'bin\exet[p"R4~fd'
'Would'
'like'
'MSCFX'
'package'
'propertiescu3u'
'bin'
'centra'
'exet[p"R4~fd'
于 2012-05-30T19:50:53.887 回答
1

\w匹配字母、数字和_(下划线)。 匹配字符和(非单词字符,) \b之间的边界。一个边界(它总是零宽度),所以没有意义。\w\W[^\w]\B\B+

编辑: 我仍然无法准确理解您要在哪里拆分单词。

如果您想匹配除.(句点)和空格之外的任何内容,请尝试以下排除方法:

[^.\s]+

如果要包含特定字符,请尝试以下包含方法:

[-\w`~!@#$%^&*\[\]()\\\/]+
于 2012-05-30T19:23:50.310 回答
1

为什么不像您的示例那样将字符串拆分为空格、反斜杠和句点?

// C#
string str = "MSCFX package.propertiescu3u bin\\exet[p\"R`4~fd"; // note the necessary escapes for \ and " 
var words = Regex.Split(str,@"[ \.\\]"); // split on spaces, periods, and backslashes
于 2012-05-30T20:14:48.117 回答