我怎么得到?!正则表达式运算符正常工作?

时间:2013-04-19 12:44:43

标签: c# .net regex

我有一个搜索字符串并使用正则表达式来找到与它不相等的所有内容。

即。像这样

string searchStr = SearchStr;
searchStr = System.Text.RegularExpressions.Regex.Escape(searchStr).
    Replace(@"\*", ".+").
    Replace(@"\?", ".");
//if (searchStr.StartsWith("!"))//(?!hede).)
//    searchStr = "?!" + searchStr.Substring(1);

然后我做了Regex.isMatch,但我不能让?!做一个不是以下模式,任何想法?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你不能只追加?在开始时,你需要做一个负向前瞻组,并根据你搜索的内容/方式,你想要锚定它。这样的事情可能会取决于你正在做的事情:

searchStr = "^(?!" + searchStr.Substring(1) + "$).*";

虽然否定正则表达式结果可能更容易:

Regex r = new Regex(..);
Match m = r.Match(someText);
if (m.Success != searchStr.StartsWith("!")) {
  // matches!
} 

.StartsWith("!") false 时,您希望正则表达式成功(返回 true ),反之亦然。

答案 1 :(得分:0)

如果您要搜索不等于something的字词,请尝试:

\b(?!something\b)\w+\b

以编程方式构建它:

String.Format(@"\b(?!{0}\b)\w+\b", Regex.Escape(negativeSearchStr))

说明:

\b\w+\b

是单词的模式

(?!something) 

是该词不以something开头的否定前瞻。最后:

(?!something\b)

是该词不等于something的否定前瞻。

答案 2 :(得分:0)

如果您希望避免使用不以术语开头的字符串,那么您将使用lookbehind。 Lookbehinds和lookaheads应该括在括号中。现在,如果你没有添加括号,你似乎只是在进行文字搜索,因为你正在搜索一个实际上有问号和感叹号的字符串。

所以我们假设我们有字符串“abc”和“bbc”,我们想找到一个不以a开头的字符串。你的lookbehind正则表达式将如下所示。

(?<!a)b