Regexp在组内查找匹配项

nwlls2ji  于 2023-04-13  发布在  其他
关注(0)|答案(4)|浏览(169)

我想匹配<pre></pre>标签,而不是匹配\\n,并用</pre><pre>替换匹配的\\n
所以我想用[one, two, three, four, five, six]匹配一个列表,并用<pre>one</pre><pre>two</pre> etc.替换它
输入:

<pre> one 
two 
three 
four 
five 
six </pre>

输出:

<pre>one</pre><pre>two</pre><pre>three</pre><pre>four</pre><pre>five</pre><pre>six</pre>

(?<=<pre>)?(.*)\n+
但是如果我删除第一个<pre>标记,它仍然是数学,但它不应该

cygmwpex

cygmwpex1#

你可以使用这个正则表达式来搜索\G

(?:<pre>|(?!\A)\G) *(\S*) *(?:(?<!<\/pre>)\n|<\/pre>)(?=[\s\S]*?<\/pre>)

并替换为:

<pre>$1</pre>

RegEx Demo

RegEx详情:

  • (?::启动非捕获组
  • <pre>:匹配<pre>
  • |:或
  • (?!\A)\G
  • ):结束非捕获组
  • *(\S*) *:匹配0个或多个非空格字符并捕获组#1中的字符。它可以在两侧用0或空格包围
  • (?::启动非捕获组
  • (?<!<\/pre>)\n:如果换行符前面没有结束</pre>,则匹配换行符
  • |:或
  • <\/pre>:匹配</pre>
  • ):结束非捕获组
  • (?=[\s\S]*?<\/pre>)正向预测,以Assert存在</pre>
cx6n0qe3

cx6n0qe32#

大多数语言都提供了一种使用函数来执行regexp替换的方法;例如Python、PHP和JavaScript。因此,您可以使用一个函数替换<pre></pre>的匹配项,该函数删除原始标记并将<pre>...</pre> Package 在每行周围。
在Python中,这将是:

def add_pre(match):
    lines = re.sub(r'\s*</?pre>\s*', '', match.group())
    return re.sub(r'^.*$', r'<pre>\g<0></pre>', lines, flags=re.MULTILINE)

text = re.sub(r'<pre>.*?</pre>', add_pre, text, flags=re.DOTALL)
soat7uwm

soat7uwm3#

因此,如果我理解正确的话,您需要用<pre></pre> Package 每一行,同时删除\n,这样您的结果就是一行。
我的方法是将字符串分成三部分:

  • 字符串的开头:在空格前面加上一个可能的<pre>。我们的想法是在替换时总是包含一个<pre>,这样在它已经存在的情况下更容易首先删除它。
  • 要保留的字符串的内容。
  • 字符串的结尾:尾随空格和可能的</pre>,以及可能的\n。这将全部替换为</pre>

我建议的正则表达式是(^\s*(<pre>)?\s*)(.*?)(\s*(<\/pre>)?\s*$\n?)。你想要保留的组是$3,所以你必须用<pre>$3<\/pre>替换每个匹配。

bttbmeg0

bttbmeg04#

您可以对</pre>使用前瞻Assert,而不传递<pre>
根据定义正则表达式所使用的环境,有一些注意事项:

  • .不能捕获新的行字符。这种行为通常可以用s标志来改变,或者你可以使用[\s\S]而不是.来真正匹配任何字符。
  • 斜线可能需要转义。

建议的正则表达式:

\n(?=(?:(?!<pre>)[\s\S])*<\/pre>)

这假设每个</pre>都与前面的<pre>匹配,并且这些标记没有嵌套。

相关问题