如何在 VBS 中使用正则表达式模式来匹配前面或后面没有换行或回车 return 的逗号?

How do I use a regex pattern in VBS to match commas not preceded or followed by a line feed or carriage return?

据我了解正则表达式,我认为这种模式应该在 VBS 中工作,以在换行符或回车 return 之前或之后的字符串中提取逗号作为子匹配 0 或子匹配 1(一个前两个模式组):

oRe.Pattern = "(,[\n\r])|([\n\r],)|(.{2},.{2})"

但是,在下面的字符串摘录中,子匹配 2(第三个模式组)正在选取逗号,每个逗号前面都有一个回车 return: I want these commas ignored

图片中的代码如下:

SELECT
 di.QuestionSetID AS SectionID
,di.ScoreNBR AS SectionLowestTopBoxNBR
,di.AveragePercentileNBR AS SectionTopBoxPercentileRankNBR 
,qdate.QuarterStartDTS AS SectionStartDTS 
FROM NRCPicker.PatientSatisfaction.DimensionPercentile AS di
INNER JOIN (

谁能看出为什么这些逗号被选为子匹配 2?

我的模式基于这篇文章:http://www.rexegg.com/regex-best-trick.html。我还使用 regex101.com 开发和测试此模式。

我正在使用 VBS 通过使用 split(string, ",") 创建数组来解析 SQL 脚本中的字段。在某些情况下,复合字段中包含逗号。我不想在这些逗号上进行拆分,因此在执行拆分操作之前,我将这些逗号替换为 space。然后,我的正则表达式模式的结果将是仅选取那些前后没有回车符 return/line 提要的逗号,并将它们替换为 space。

希望这能更好地说明我正在尝试做的事情:

这是我的 VBscript 示例:

SQLScript = "SELECT
 di.QuestionSetID AS SectionID
,di.ScoreNBR AS Section,LowestTopBoxNBR
,di.AveragePercentileNBR AS SectionTopBoxPercentileRankNBR 
,qdate.Quarter,StartDTS AS Section,StartDTS 
FROM NRCPicker.PatientSatisfaction.DimensionPercentile AS di
INNER JOIN ("
oRe.Pattern = "(,[\n\r])|([\n\r],)|(.{2},.{2})" 
oLoadFields = oRe.Replace(SQLScript, "")

预期输出(仅当逗号不在行首或行尾时才用 space 替换):

oLoadFields = "SELECT
 di.QuestionSetID AS SectionID
,di.ScoreNBR AS Section LowestTopBoxNBR
,di.AveragePercentileNBR AS SectionTopBoxPercentileRankNBR 
,qdate.Quarter StartDTS AS Section StartDTS 
FROM NRCPicker.PatientSatisfaction.DimensionPercentile AS di
INNER JOIN ("

您只匹配了第一个匹配项 - 即,

SELECT di.QuestionSetID AS SectionID ,<- 这里

不过,您没有看到任何效果,因为您在 "".

中用捕获的相同文本替换了它

如果您不想匹配 line-spaces 周围的逗号,并且只替换行中间的逗号,您想要做的是不将逗号锚定到 [\r\n]。您可以使用插入符反转它:[^\r\n] 以便它匹配任何非 \r\n 的内容。然后,您需要相应地重新构建模式。

([^\r\n]),([^\n\r]) 将匹配逗号任一侧不是 \r 或 \n 的任何内容,并在 $1 和 $2 中捕获这些字符。因此,要用 space 替换逗号,您的替换字符串应为:" ".

SQLScript = "SELECT
 di.QuestionSetID AS SectionID
,di.ScoreNBR AS Section,LowestTopBoxNBR
,di.AveragePercentileNBR AS SectionTopBoxPercentileRankNBR 
,qdate.Quarter,StartDTS AS Section,StartDTS 
FROM NRCPicker.PatientSatisfaction.DimensionPercentile AS di
INNER JOIN ("
oRe.Pattern = "([^\r\n]),([^\n\r])" 
oLoadFields = oRe.Replace(SQLScript, " ")

如果VBS使用的引擎与JS使用的引擎大致相同,那么你可以
利用前瞻断言和 BOL/EOL 主播。

多行模式中:

找到(?!^),(?!$)
替换为 space

https://regex101.com/r/LRXNvz/1

更新说明:
请注意,您不能只捕获逗号左右两边的内容,
然后写回去 因为可能有相邻的连续逗号。
所以像 (.),(.) 这样的东西是行不通的。

例1:匹配'hello,,,,,world'当前位置
超过下一个逗号,永远不会匹配第二个逗号。

示例 2:匹配 'hello,,,,,world' 回写一个逗号。
你可以在这里看到这种功能障碍 https://regex101.com/r/u5CPgb/1

这样试试:

(\S+?),(?=\S+)

我们利用了这样一个事实,即有问题的 , 总是被非白人包围space \S。由于在 VBScript 的 RegExp 中没有(正向)回溯,我只是捕获前导部分并将其放回去,同时逗号本身被 space 替换:" ".

如果行尾或行首有额外的白色space,这也有效。

Demo

代码示例:

Set re = New RegExp
re.Pattern = "(\S+?),(?=\S+)"
re.Global = True
Dim Input 
Input = "SELECT " & vbCRLF & _
" di.QuestionSetID AS SectionID, " & vbCRLF & _
" di.QuestionSetID AS SectionID2 " & vbCRLF & _
",di.ScoreNBR AS Section,LowestTopBoxNBR" & vbCRLF & _
",di.AveragePercentileNBR AS SectionTopBoxPercentileRankNBR " & vbCRLF & _
",qdate.Quarter,StartDTS AS Section,StartDTS "& vbCRLF & _
"FROM NRCPicker.PatientSatisfaction.DimensionPercentile AS di" & vbCRLF & _
"INNER JOIN ("

msgbox re.Replace(Input, " ")