匹配& lt; keyword>在行尾/行首有空格

本文关键字:行首 空格 lt keyword 匹配 | 更新日期: 2023-09-27 18:10:55

我不知道如何让c# regex 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))

匹配& lt; keyword>在行尾/行首有空格

问题是字符类内部的^$不被视为锚,而是作为文字字符。您可以简单地使用替代字符类:

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

注意,这里不需要+,因为您只想确保是否有一个空格。你不在乎他们是否有更多的人。?:只是一个很好的练习,它抑制了你在这里不需要的捕获。@使字符串成为一个逐字字符串,这样您就不必对反斜杠进行双转义。

还有另一种方法,我觉得稍微简洁一点。您可以使用遍历,以确保在关键字的左右没有非空格字符(是的,双重否定,考虑一下)。如果有空格字符或者字符串只有一个结尾,这个假设是有效的:

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

这是完全相同的,但可能会稍微更有效(您必须对其进行分析才能确定,尽管-如果它甚至重要的话)。

您还可以使用(正)遍历的第一种模式(非倒置逻辑):

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

然而,这对第一个模式并没有什么区别,除非你想在一个字符串中找到多个匹配。

顺便说一下,如果您的keyword可能包含regex元字符(如|, $, +等),请确保首先使用Regex.Escape
进行转义。

我不太确定你到底想用这个正则表达式完成什么,但是下面的代码将匹配字符串'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断言了开始和结束单词边界的位置。在本例中,我假设感兴趣的单词是keyword。

我还认为,从我对你的问题的解释来看,你可能对匹配关键字后面直到换行符的整个字符系列感兴趣。如果是这种情况,下面的regex代码将返回匹配:

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
}

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

我希望以上是有帮助的,如果不是这次,也许在未来。我一直在尝试发现替代实践来达到相同的结果,所以如果你有任何建设性的批评,请发布出来。

最好的祝愿,史蒂夫。

试试这个:

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

我发现了这个帖子如何指定"空格"或"字符串结束"和&;空格或字符串的开始&;?

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

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