C# 点字模式匹配
我想创建一个正则表达式来匹配以句点开头的单词。一个字符串中的单词可以存在N次。我想确保这个词出现在一行的开头、一行的结尾或者中间的某个地方。后一部分是我遇到的困难 这就是我目前所处的位置C# 点字模式匹配,c#,regex,C#,Regex,我想创建一个正则表达式来匹配以句点开头的单词。一个字符串中的单词可以存在N次。我想确保这个词出现在一行的开头、一行的结尾或者中间的某个地方。后一部分是我遇到的困难 这就是我目前所处的位置 const string pattern = @"(^|(.* ))(?<slickText>\.[a-zA-Z0-9]*)( .*|$)"; public static MatchCollection Find(string input) { Regex regex = new Rege
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;
}
在您的正则表达式中,单词必须以空格结尾,但bruce却以空格结尾。奇怪的是,似乎使用了
正则表达式。多行
,^
和$
只会额外匹配\n
,而不是\r\n
因此,您得到了.good
,因为它前面有\n
,它由^
匹配,但您没有得到.bruce
,因为它后面是\r
,而$
不匹配
您可以对输入执行.Replace(“\r”,”)
,或者重写表达式以获取单独的输入行
编辑:或将模式中的
$
替换为\r?$
,以明确包含\r
;感谢您的建议。也许您只是在寻找\。\w+
测试:
var s = "a short stump .bruce\r\nand .lee a small tree\r\n.good roots";
Regex.Matches(s, @"\.\w+").Dump();
结果:
var s = "a short stump .bruce\r\nand .lee a small tree\r\n.good roots";
Regex.Matches(s, @"\.\w+").Dump();
注:
如果您不想在
some.foo
中找到foo
(因为some
和.foo
之间没有空格),您可以使用(?我会试试这个正则表达式:
(?:.*?(\.[A-Za-z]+(?:\b|.\s)).*?)+
并将regex选项从多行更改为单线-在此模式下,点匹配包括换行符在内的所有字符。为什么要使用行首和行尾定位?@Oded,因为没有它们regex就不一样了?@Rawling-如果OP需要匹配传入字符串中的任何位置,使用行首和行尾定位只会进入t对了,不,换行符给了我一个很好的终止序列。如果没有它,一些序列将很难匹配而不破坏其他模式。例如,如果没有多行模式,我如何在这个短语中定位关键字?。一个\r\n.二个
我仍然无法理解为什么需要锚定。你呢可以在没有多行的情况下匹配.1和.2。多行模式只需更改^
和$
的定义。正则表达式仍将搜索整个字符串,无论是否为换行符。看到了吗?我有(.*
我将其解释为以空格和0个或更多字符或行尾结尾。哦,对不起,你是对的,我读得不够透彻。但似乎至少在某个地方出现了问题(可能是罗琳在这里找到了问题所在),或者你可以像这样明确地接受:(.*\r?$)但坦率地说,我更喜欢Dominic的答案,只要你没有理由使用相当复杂的正则表达式;)我喜欢\r?$
,它避免了在运行正则表达式之前修改或拆分字符串。你提到的$
的行为有非常清晰的文档记录:(Microsoft推荐你的解决方案:\r?$
)@电子人X37谢谢,这是我想要的参考资料。很高兴知道Sven也很在行:)将[0a-zA-Z0-9]
替换为\w
只允许使用下划线(这可能是OP不需要的),根本无助于解决行的开始/结束问题。用<代码>替换(< @×*)<代码> >(@ @ RWLLIN <代码> > \\W+将很高兴地匹配一个以周期开始的单词(LL),不管它是在行的开头、行的结尾还是中间的某个地方。也许您希望<代码>(?它将在任何地方匹配它们,但在OP的正则表达式显式不匹配的情况下(例如,前面有逗号)也会匹配它们)我选择相信OP明确地想要排除这些情况,而不是编写一个过于复杂的表达式。好吧,OP从来没有提到他/她不想在单词以逗号分隔时匹配它们。但是正如我已经提到的,前瞻(?@P.Brian.Mackey你读过我的答案的开头部分了吗?如果你不想在some.foo中找到foo
?:-)我需要火柴组。更新:(?:*(?\.[A-Za-z]+(?:\b |.\s))+
。测试字符串:“一个短树桩。布鲁斯和李安一棵小树。好根。然后是另一个字符串。”
应该有4个匹配项,我只得到3个。