匹配字段包含在标点符号中但不包含单个撇号

时间:2013-09-16 16:05:01

标签: c# regex

我使用以下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'我在这里做错了什么?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

我认为这背后的原因是背后的明星*和前瞻,因为它匹配零或更多,所以在匹配FieldA后它自己然后检查后面为零或更多不是撇号的标点符号,但由于有撇号,它只匹配零次。

您可以通过将星标更改为加号+来解决此问题:

string posLookBehind = @"(?<=[\p{P}-[']]+)\b";
string posLookAhead = @"\b(?=[\p{P}-[']]+)";

或者如果一直只有一个周围的角色:

string posLookBehind = @"(?<=[\p{P}-[']])\b";
string posLookAhead = @"\b(?=[\p{P}-[']])";