1

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

谢谢你的时间。

4

1 回答 1

2

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

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

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

或者如果一直只有一个周围的字符,那么:

string posLookBehind = @"(?<=[\p{P}-[']])\b";
string posLookAhead = @"\b(?=[\p{P}-[']])";
于 2013-09-16T16:17:03.980 回答