正则表达式模式检测像$$ _ $$这样的东西

时间:2015-05-13 09:46:30

标签: javascript regex

我正在尝试编写一个如下所示的正则表达式,如果我有类似

的东西
Hi $$var1$$ $$var2$$ how are you?

它应该给我两场比赛

$$var1$$ -1st match

$$var2$$ -2nd match

目前我已经制作了一个正则表达式/\$\$\w+\d*\W*\$\$/gi如果两个模式不是彼此相邻的,例如:

Hi $$var1$$ and $$var2$$ how are you?

它会检测到两个匹配项,但如果这两个匹配项彼此相邻,就像第一个按空格分隔的示例一样,则会检测到$$var1$$ $$。有人可以帮我修复这个正则表达式吗?

2 个答案:

答案 0 :(得分:2)

 \$\$\w+\d*?\W*?\$\$
              ^^

\W非贪婪,因为它会消耗$$ $$而不是$$ and $$,因为它无法消耗and。请参阅演示。

https://regex101.com/r/tP7qE7/5

答案 1 :(得分:2)

我不知道你所有的限制,但是否定课程可能更容易,更快:

\$\$[^$]+\$\$

如果在双重符号之间允许单个美元符号,那么您可以使用类似的东西来保持相同的速度:

\$\$(?:[^$]+|\$(?!\$))+\$\$

(?:[^$]+|\$(?!\$))+匹配非$或一个$后面没有第二个$(虽然此时\$\$.+?\$\$实际上是\W*应该更简单)。

你的正则表达式没有按预期行事的原因是\w可能与任何美元符号匹配。因此,如果在您要匹配的模式的最后一个美元符号之间存在任何与#define VIDEO_FRAME_RATE 25.0f while (RECORDING) { sprintf(buffer, "Someting from a data struct that is updated\n"); fprintf(Output, buffer); usecTosleep = (1.0f/VIDEO_FRAME_RATE) * 1000000; usleep(usecToSleep); } 不匹配的内容,则您的正则表达式将继续匹配,直到下一个双美元符号。