我想创建一个正则表达式来匹配以句点开头的单词。单词可以在字符串中存在N次。我想确保这个词出现在行的开头,行的末尾还是中间的某个地方。后一部分是我遇到的困难。
这是我到目前为止所处的位置。
const string pattern = @"(^|(.* ))(?<slickText>\.[a-zA-Z0-9]*)( .*|$)";
public static MatchCollection Find(string input)
{
Regex regex = new Regex(pattern,RegexOptions.IgnoreCase | RegexOptions.Multiline);
MatchCollection collection = regex.Matches(input);
return collection;
}
我的测试模式找到.lee
和.good
。我的测试模式无法找到.bruce
:
static void Main()
{
MatchCollection results = ClassName.Find("a short stump .bruce\r\nand .lee a small tree\r\n.good roots");
foreach (Match item in results)
{
GroupCollection groups = item.Groups;
Console.WriteLine("{0} ", groups["slickText"].Value);
}
System.Diagnostics.Debug.Assert(results.Count > 0);
}
答案 0 :(得分:2)
也许您只是在寻找\.\w+
?
<强>测试强>
var s = "a short stump .bruce\r\nand .lee a small tree\r\n.good roots";
Regex.Matches(s, @"\.\w+").Dump();
<强>结果:强>
注意:
如果您不想在foo
中找到some.foo
(因为some
和.foo
之间没有空格),您可以使用(?<=\W|^)\.\w+
代替
答案 1 :(得分:1)
奇怪的是,似乎只有RegexOptions.Multiline
,^
和$
只会额外匹配\n
,而不是\r\n
。
因此,您获得了.good
,因为它前面有\n
,后面跟^
匹配,但您不获得.bruce
,因为它由\r
继承,但$
不匹配。
您可以对输入执行.Replace("\r", "")
,或重写表达式以获取单独的输入行。
修改:或在模式中将$
替换为\r?$
,以明确包含\r
;感谢SvenS
的建议。
答案 2 :(得分:0)
在你的RegEx中,一个单词必须以空格终止,但布鲁斯会被\ r \ n终止。
答案 3 :(得分:-1)
我会给这个正则表达式:
(?:.*?(\.[A-Za-z]+(?:\b|.\s)).*?)+
将RegexOptions从Multiline更改为Singleline - 在此模式下,dot匹配包括换行符在内的所有字符。