2

我不知道如何让 C# 正则表达式IsMatch匹配 a<keyword>后跟行尾或空格。

我目前有[\s]+keyword[\s]+which 适用于空间,但不适用于keyword<end of string>or <start of string>keyword

我试过[\s^]+keyword[\s$]+了,但这使它无法与空格匹配,并且在字符串的末尾或开头不起作用。

这是我尝试过的代码:

string pattern = string.Format("[\\s^]+{0}[\\s$]+",keyword);
if(Regex.IsMatch(Text, pattern, RegexOptions.IgnoreCase))
4

4 回答 4

9

问题是^$内部字符类不被视为锚,而是作为文字字符。您可以简单地使用交替而不是字符类:

string pattern = string.Format(@"(?:\s|^){0}(?:\s|$)",keyword);

请注意,不需要+,因为您只想确定是否有一个空格。你不在乎他们是否有更多。这?:只是一种很好的做法,并且会抑制您在此处不需要的捕获。并且@使字符串成为逐字字符串,您不必双重转义反斜杠。

还有另一种方法,我觉得它稍微整洁一些。您可以使用lookarounds,以确保关键字的左右两侧没有非空格字符(是的,双重否定,请考虑一下)。如果存在空格字符或字符串有一端,则此假设有效:

string pattern = string.Format(@"(?<!\S){0}(?!\S)",keyword);

这完全一样,但可能效率更高一些(不过,您必须对其进行分析才能确定 - 如果它甚至很重要)。

您还可以将第一个模式(具有非反转逻辑)与(正)环视一起使用:

string pattern = string.Format(@"(?<=\s|^){0}(?=\s|$)",keyword);

但是,这对第一个模式并没有真正的影响,除非您想在一个字符串中找到多个匹配项。

顺便说一句,如果您keyword可能包含正则表达式元字符(如|$+),请务必先使用Regex.Escape

于 2013-04-25T11:25:04.267 回答
1

我不确定你真的想用这个正则表达式来完成什么,但是下面的代码将匹配字符串“关键字”,当它的两边都有空格时:

string resultString = null;
try {
    Regex regexObj = new Regex(@"\b(keyword)\b");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

一般可以解释为:\b 断言在开始和结束词边界的位置。在这种情况下,我假设感兴趣的词是关键字。

从我对您问题的解释中,我还认为您可能有兴趣匹配关键字后面的整个字符系列直到换行符。如果是这种情况,则以下正则表达式代码将返回该匹配项:

string resultString = null;
try {
    Regex regexObj = new Regex(@"\bkeyword\b(\w*\s*)$");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

这个正则表达式可以解释为找到开始和结束单词的边界,这就是 \b 在两边的原因。(\w*\s*) $ 读起来像这样匹配所有单词 \w字符和空格字符 \s* 的出现次数,并将位置移动到 $ 行的末尾。

下一段代码将读入包含关键字的整行数据,不包含关键字的数据行将不匹配。

string resultString = null;
try {
    Regex regexObj = new Regex("^.*keyword.*$");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

解释:字符串开头的 ^ 位置,.* 匹配任何不是换行符的字符,然后包含关键字,后跟 .*,因此包含剩余的非换行符,$ 断言位于字符串末尾的位置,在此示例中将是整行。

我希望以上内容对您有所帮助,如果不是这次,也许将来会有所帮助。我一直在尝试发现替代做法以达到相同的结果,因此,如果您有任何建设性的批评,请发表。

最好的祝愿,史蒂夫

于 2013-04-25T13:00:53.033 回答
0

尝试这个:

string pattern = string.Format("^\\s*{0}\\s*$",keyword);
于 2013-04-25T11:12:27.077 回答
0

我发现了这篇其他帖子 如何指定“空格或字符串结尾”和“空格或字符串开头”?

这回答了这个问题,所以我的代码现在是

string pattern = string.Format("\\b+{0}\\b+",keyword);
if(Regex.IsMatch(UserText, pattern, RegexOptions.IgnoreCase))
于 2013-04-25T11:27:36.253 回答