我需要一个正则表达式来查找像
这样的子字符串from xyzTableName with ( index =...
和
from xyzTableName ( index =...
如果不存在with
关键字,那么它应该返回匹配项,如果with
关键字之后FROM
关键字存在(
,那么应该没有匹配项。必须忽略from
和(
之间的所有其他字词。
我尝试过以下表达式:
@"\bfrom.*[\s\t\n]+(?<!with)[\s\t\n]([\s\t\n]+index"
和一些相同的变种。当只有正常/单个空格时,我能够解决这个问题。但是当我尝试使用多个空格和换行符时,它失败了。
答案 0 :(得分:1)
尝试此模式:\bfrom\b(?!.+\bwith\b)[^(]+\(\s*index
string input = @"from xyzTableName
with ( index =...";
string pattern = @"\bfrom\b(?!.+\bwith\b)[^(]+\(\s*index";
bool result = Regex.IsMatch(input, pattern,
RegexOptions.Singleline | RegexOptions.IgnoreCase);
以上返回false
。更改输入以删除单词“with”,它将返回true
。使用RegexOptions.Singleline
.
元字符将匹配所有字符,包括换行符(\n
)。
模式分解:
\bfrom\b
:与“from”一词完全匹配,并使用字边界元字符(?!.+\bwith\b)
:负面预测以检查“with”,如果匹配将失败[^(]+
:负字符类,用于匹配任何不是左括号的字符,至少一次。\(\s*index
:匹配一个左括号(注意它必须被转义),任何空格,然后单词“index”