C# 点字模式匹配

C# 点字模式匹配,c#,regex,C#,Regex,我想创建一个正则表达式来匹配以句点开头的单词。一个字符串中的单词可以存在N次。我想确保这个词出现在一行的开头、一行的结尾或者中间的某个地方。后一部分是我遇到的困难 这就是我目前所处的位置 const string pattern = @"(^|(.* ))(?<slickText>\.[a-zA-Z0-9]*)( .*|$)"; public static MatchCollection Find(string input) { Regex regex = new Rege

我想创建一个正则表达式来匹配以句点开头的单词。一个字符串中的单词可以存在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;
}

在您的正则表达式中,单词必须以空格结尾,但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个。