我无法弄清楚如何让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))
答案 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
}
解释:字符串开头的^位置,。*匹配任何不是换行符的字符,然后包含关键字后跟。*,因此包含剩余的非换行字符,并且$断言字符串末尾的位置,这个位置就是本例中的整行。
我希望如果不是这一次,将来可能会有所帮助。我总是试图找到替代做法以达到相同的结果,所以如果你有任何建设性的批评,请发布。
祝福, 史蒂夫