根据我对正则表达式的理解,我认为这种模式应该在 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