用标点符号换行的匹配字段,但不是单个撇号

本文关键字:单个撇 字段 换行 标点符号 | 更新日期: 2023-09-27 18:31:26

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

谢谢你的时间。

用标点符号换行的匹配字段,但不是单个撇号

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

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

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

或者,如果始终只有一个周围字符,则:

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