我无法弄清楚如何使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)
问题是,^和$字符类里面船锚,但作为文字字符不处理.您可以简单地使用替换而不是字符类:
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
| 归档时间: |
|
| 查看次数: |
2208 次 |
| 最近记录: |