我不知道如何获取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))

最佳答案

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

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对其进行转义。

关于c# - 将<keyword>与行尾/行首的空格匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16213169/

10-12 06:48