将<keyword>与行</keyword>的结尾/开头的空格进行匹配

时间:2013-04-25 11:09:59

标签: c# regex

我无法弄清楚如何让C#正则表达式IsMatch匹配<keyword>后跟行尾或空格。

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

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

这是我尝试过的代码:

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

4 个答案:

答案 0 :(得分:9)

问题是字符类中的^$不被视为锚点而是文字字符。您可以简单地使用替换而不是字符类:

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

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

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

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

这完全相同,但可能稍微有点效率(你必须要确定这一点,但是 - 如果它甚至重要的话)。

您还可以使用第一个模式(具有非反转逻辑)和(正面)外观:

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

但是,这并不会对第一个模式产生影响,除非您想在字符串中找到多个匹配项。

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

答案 1 :(得分:0)

试试这个:

string pattern = string.Format("^\\s*{0}\\s*$",keyword);

答案 2 :(得分:0)

我发现了这个帖子 How to specify "Space or end of string" and "space or start of string"?

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

string pattern = string.Format("\\b+{0}\\b+",keyword);
if(Regex.IsMatch(UserText, pattern, RegexOptions.IgnoreCase))

答案 3 :(得分:0)

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

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
}

解释:字符串开头的^位置,。*匹配任何不是换行符的字符,然后包含关键字后跟。*,因此包含剩余的非换行字符,并且$断言字符串末尾的位置,这个位置就是本例中的整行。

我希望如果不是这一次,将来可能会有所帮助。我总是试图找到替代做法以达到相同的结果,所以如果你有任何建设性的批评,请发布。

祝福, 史蒂夫