我需要一些文本文件来突破单个单词。但是对于一个非常宽松的词语定义。
\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;
}
答案 0 :(得分:1)
\w
匹配字母,数字和_
(下划线)。 \b
匹配\w
个字符与\W
(非字字符[^\w]
)之间的边界。 \B
一个边界(它总是零宽度),所以\B+
毫无意义。
修改:我仍然无法准确理解您想要分解的位置。
如果您想匹配除.
(句点)和空格以外的任何内容,请尝试使用排除方法:
[^.\s]+
如果您想要包含特定字符,请尝试使用包含方法:
[-\w`~!@#$%^&*\[\]()\\\/]+
答案 1 :(得分: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'
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分:1)