Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配<;关键词>;行尾/行首有空格_C#_Regex - Fatal编程技术网

C# 匹配<;关键词>;行尾/行首有空格

C# 匹配<;关键词>;行尾/行首有空格,c#,regex,C#,Regex,我不知道如何让C#regexIsMatch匹配一个后跟行尾或空格 我目前有[\s]+关键字[\s]+用于空格,但不适用于关键字或关键字 我尝试了[\s^]+关键字[\s$]+,但这使它无法与空格匹配,并且在字符串的结尾或开头不起作用 以下是我尝试的代码: string pattern = string.Format("[\\s^]+{0}[\\s$]+",keyword); if(Regex.IsMatch(Text, pattern, RegexOptions.IgnoreCase)) 试试

我不知道如何让C#regex
IsMatch
匹配一个
后跟行尾或空格

我目前有
[\s]+关键字[\s]+
用于空格,但不适用于
关键字
关键字

我尝试了
[\s^]+关键字[\s$]+
,但这使它无法与空格匹配,并且在字符串的结尾或开头不起作用

以下是我尝试的代码:

string pattern = string.Format("[\\s^]+{0}[\\s$]+",keyword);
if(Regex.IsMatch(Text, pattern, RegexOptions.IgnoreCase))
试试这个:

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

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

string pattern = string.Format(@"(?:\s|^){0}(?:\s|$)",keyword);
请注意,不需要
+
,因为您只需要确定是否有一个空格。你不在乎他们有没有更多。
?:
只是一种很好的做法,它会抑制您在这里不需要的内容。而
@
使字符串成为逐字逐句的字符串,您不必重复转义反斜杠

还有另一种方法,我觉得稍微整洁一点。您可以使用,以确保关键字的左右两侧没有非空格字符(是的,双重否定,请仔细考虑)。如果存在空格字符或字符串的一端,则此假设有效:

string pattern = string.Format(@"(?<!\S){0}(?!\S)",keyword);
string pattern=string.Format(@)(?我找到了另一篇文章

这就回答了问题 所以我的代码现在是

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

我不太清楚您真正想用这个正则表达式实现什么,但是当字符串“keyword”两边都有空格时,下面的代码将与字符串“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声明单词开始和结束边界的位置。在本例中,我假设感兴趣的单词是关键字

我还从对您的问题的解释中认为,您可能有兴趣匹配到换行符之前跟踪关键字的整个字符系列。如果是这样,下面的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
}
解释:字符串开头的^positions、.*与任何非换行字符匹配,然后包含关键字,后跟。*,因此包含剩余的非换行字符,$声明字符串末尾的位置,在本例中,该位置为整行

我希望以上内容对你有所帮助,如果这次没有的话,也许在将来。我一直在努力寻找其他方法来达到同样的效果,所以如果你有任何建设性的批评,请发表

致以最良好的祝愿,
Steve

你能给出一个输入和输出示例吗?如果正确的话,示例是关键字输入是“这是正确的”这是正确的“正确的”也正确“错误的”fdcorrect“纠正的”dfd“我认为这不允许在行首和关键字之间使用其他单词。同样,行尾你不应该认为
+
完全没有必要
…在.NET中可能有更多的Unicode字符)和非单词字符。如果您真的想将其限制为空格,请查看我的答案。因此\b匹配任何非字符,即不匹配[a-zA-Z0-9\?我的观点是,。例如,如果您的输入字符串是
a-c
(其中
-
是非单词字符),则模式
\ba\b
将只匹配
a
-
不是匹配的一部分,因为
\b
只是检查两个相邻字符的位置,而没有实际将它们包括在匹配中。这也意味着在本例中
a\b-
(这是一个稍微无意义的模式)将给您一个匹配项。如果前后都有非空格字符,您的“向前看/向后看”是否匹配,然后如果关键字不在那里,您的“向前看/向后看”是否匹配。@f1wade我不确定您的意思。它只是符合您的说明-如果它立即被空格或字符串结尾包围,它将匹配
关键字
。它也将工作k与较长的字符串,其中
关键字
只是其中的一个词。当您使用\S而不是\S时,大写版本与非空格匹配,我想?@f1wade哦,我现在明白您的意思了。我在那里输入了一个错误。第一个环视片段应该使用负环视。如果它们的内容匹配,则会导致模式失败。这是w我说的双重否定是什么意思。谢谢你帮我完成了这个过程,我的代码现在看起来像这样的字符串模式=string.Format(@)(?
string resultString = null;
try {
    Regex regexObj = new Regex("^.*keyword.*$");
    resultString = regexObj.Match(subjectString).Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}