匹配& 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))
问题是字符类内部的^
和$
不被视为锚,而是作为文字字符。您可以简单地使用替代字符类:
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))