首页 > 解决方案 > 匹配两个字符之间的所有内容,除非有空行

问题描述

我试图找到一个匹配一个或两个美元符号之间的所有内容的正则表达式模式\$.*\$|\${2}.*\${2},除非有一个空行(它是两个或一个,不能是这个:)\$.*\$\$。下面,我提供了我想要匹配和想要跳过的示例。匹配应包括/排除所有内容。

我要匹配的示例:

$$ \abc + ko$$
$*-ls$

这里单个美元符号前面有一个转义字符,所以它不会破坏匹配。

$$
654a\$
$$ 
$123
a*/\
[]{}$

我要排除的示例:

$$

asd
$$
$asdasd$$

同样,如果它们在每一侧被一个 $ 或两个 $ 绑定,我想匹配所有内容,除非两者之间有(是)空行。


到目前为止,我想出了如何匹配单行中出现的那些,但我正在努力如何包含断线并在整行为空时排除它们。

这是我所拥有的:

^\${2}.*[^\\$]\${2}$|^\$.*[^\\$]\$$

演示

标签: javascriptphpregexstring

解决方案


对于您的示例数据,您可以使用

(?<!\S)(\$\$?+)[^\r\n$]*(?:\$(?!\$)[^\r\n$]*)*(?:\r?\n(?![^\S\r\n]*$)[^\r\n$]*(?:\$(?!\$)[^\r\n$]*)*)*\1(?!\S)

解释

  • (?<!\S)在左侧断言空白边界
  • (\$\$?+)捕获组 1,匹配 $ 或 $$ ,其中第二个是所有格(防止回溯)
  • [^\r\n$]*(?:\$(?!\$)[^\r\n$]*)*匹配除$或换行符或 $ 之外的任何字符,而不是直接跟随另一个字符$
  • (?:非捕获组
    • \r?\n(?![^\S\r\n]*$)匹配换行符,断言不是仅包含空格的行
    • [^\r\n$]*(?:\$(?!\$)[^\r\n$]*)*与上面相同的模式
  • )*关闭组并重复0+次
  • \1对第 1 组中捕获的内容的反向引用
  • (?!\S)在右侧断言空白边界

正则表达式演示


推荐阅读