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

f1w*_*ade 2 c# regex

我无法弄清楚如何使C#正则表达式IsMatch匹配a <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))
Run Code Online (Sandbox Code Playgroud)

Mar*_*der 9

问题是,^$字符类里面船锚,但作为文字字符不处理.您可以简单地使用替换而不是字符类:

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

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

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

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

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

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

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

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

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