我使用以下Regex
来翻译SQL字符串中的字段
string posLookBehind = @"(?<=\p{P}*)\b";
string posLookAhead = @"\b(?=\p{P}*)";
string keyword = "FieldA";
string translatedKeyword = "FldA";
string strSql = "SELECT [FieldA] FROM SomeTableA;";
strSql = Regex.Replace(
strSql,
baseRegexLeft + keyword + baseRegexRight,
translatedKeyword,
RegexOptions.IgnoreCase);
对于某些关键字FieldA
,上述正则表达式会在以下各项中将'FieldA'替换为'FldA':[FieldA]
,[FieldA + FieldB]
等。但是,我现在希望限制正则表达式。 我不想匹配 'FieldA'
请注意单撇号。
所以,我使用正则表达式减法更改了正则表达式,从标点符号集中删除'
:
string posLookBehind = @"(?<=[\p{P}-[']]*)\b";
string posLookAhead = @"\b(?=[\p{P}-[']]*)";
其他代码相同。但这仍然匹配'FieldA'
。 我在这里做错了什么?
感谢您的时间。
答案 0 :(得分:2)
我认为这背后的原因是背后的明星*
和前瞻,因为它匹配零或更多,所以在匹配FieldA
后它自己然后检查后面为零或更多不是撇号的标点符号,但由于有撇号,它只匹配零次。
您可以通过将星标更改为加号+
来解决此问题:
string posLookBehind = @"(?<=[\p{P}-[']]+)\b";
string posLookAhead = @"\b(?=[\p{P}-[']]+)";
或者如果一直只有一个周围的角色:
string posLookBehind = @"(?<=[\p{P}-[']])\b";
string posLookAhead = @"\b(?=[\p{P}-[']])";