如何在 VBS 中使用正则表达式模式来匹配不在换行符或回车符之前或之后的逗号?



根据我对正则表达式的理解,我认为这种模式应该在 VBS 中拾取字符串中的逗号,这些逗号之前或之后是换行符或回车符作为子匹配 0 或子匹配 1(前两个模式组之一(:

oRe.Pattern = "(,[nr])|([nr],)|(.{2},.{2})"

但是,在下面的字符串摘录中,子匹配 2(第三个模式组(正在拾取逗号,每个逗号前面都有一个回车符: 我希望忽略这些逗号

这是图片中的代码:

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 脚本中的字段。在某些情况下,存在包含逗号的复合字段。我不想在这些逗号上拆分,因此在执行拆分操作之前,我用空格替换这些逗号。然后,我的正则表达式模式的结果是仅拾取那些不在回车/换行符之前或之后的逗号,并用空格替换它们。

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

这是我的 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 = "(,[nr])|([nr],)|(.{2},.{2})" 
oLoadFields = oRe.Replace(SQLScript, "$1$2$3")

预期输出(仅当不在行首或行尾时,逗号才替换为空格(:

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 ,<- 这里

但是,您没有看到任何效果,因为您在执行"$1$2$3"时将其替换为捕获的相同文本。

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

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

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 = "([^rn]),([^nr])" 
oLoadFields = oRe.Replace(SQLScript, "$1 $2")

像这样尝试:

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

我们利用了这样一个事实,即所讨论的,总是被非空格S包围。由于 VBScript 的 RegExp 中没有(积极的(后视,我只是捕获前导部分并将其放回原处,而逗号本身被空格替换:"$1 "

如果行尾或开头有额外的空格,这也有效。

演示

代码示例:

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, "$1 ")

如果 VBS 使用的引擎与 JS 使用的引擎大致相同,则可以
利用前瞻断言和 提单/EOL 锚点。

多行模式下

查找(?!^),(?!$)
替换为空格

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

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

示例 1:它匹配"地狱o,,,,,世界",它将当前位置
推进到下一个逗号之后,并且永远不会匹配第二个逗号。

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

最新更新