regex - 使用正则表达式获取最短匹配

标签 regex

我尝试使用正则表达式做一些事情,但我不确定它是否可行。

我在法语维基词典上工作,我试图找到只有 #* 的行来替换它们。问题是我需要获取模板 langue 的最近参数。所以在{{langue|fr}}中,我需要得到fr

这是我的文本示例:

== {{langue|fr}} ==
=== {{S|étymologie}} ===
: Emprunté au {{étyl|ja|fr|mot=津波|tr=tsunami}} du même sens, littéralement « [[vague]] [[portuaire]] ».

=== {{S|nom|fr}} ===
{{fr-rég|tsu.na.mi|pron2=tsy.na.mi}}
'''tsunami''' {{pron|tsu.na.mi|fr}} ''ou'' {{pron|tsy.na.mi|fr}} {{m}}
# Énorme [[vague]] causée par un [[évènement]] [[géologique]] comme un [[séisme]] ou une [[éruption]] volcanique ou [[astronomique]] comme un [[météorite]].
#* ''Le '''tsunami''' de décembre 2004 a balayé l’Asie du Sud-Est.''

== {{langue|en}} ==
=== {{S|étymologie}} ===
: Du {{étyl|ja|en|mot=津波|tr=tsunami}}.

=== {{S|nom|en}} ===
{{en-nom|tsunami|tsunami|p2=tsunamis|tsu.ˈnɑ.mi|tsu.ˈnɑ.mi|pp2=tsu.ˈnɑ.miz}}
'''tsunami'''
# [[#fr|Tsunami]].
#* {{ébauche-exe|en}}

== {{langue|es}} ==
=== {{S|étymologie}} ===
: Du {{étyl|ja|es|mot=津波|tr=tsunami|sens=}}.

=== {{S|nom|es}} ===
{{es-rég|}}
'''tsunami''' {{pron||es}} {{m}}
# [[#fr|Tsunami]].
#*

== {{langue|sv}} ==
=== {{S|étymologie}} ===
: {{ébauche-étym|sv}}

=== {{S|nom|sv}} ===
{{sv-nom-c-er|2=tsunamin}}
'''tsunami''' {{pron||sv}} {{c}}
# [[tsunami#fr|Tsunami]].
#* {{ébauche-exe|sv}}

我尝试使用这个正则表达式 {{langue\|([^}]+)}}((?:.|\n)+)(#+\*) ?'*\n。问题是我的正则表达式几乎计算了整个文本。这不是我想要的。在我的示例中,错误行位于 es 部分。因此,我需要获取的参数是 es。在我的正则表达式中,有三个捕获组:第一个用于语言代码,第二个用于其他两个组之​​间的所有文本,最后一个用于获取行的开头,如 # 可以改变。如果可能,我会将匹配的字符串替换为 {{langue|$1}}$2$3 {{ébauche-exe|$1}}

这可能使用这种正则表达式吗?如果是这样,如何?如果不可能,有没有办法通过正则表达式来做到这一点?

最佳答案

你可以使用

(?m)^== {{langue\|([^{}]+)}}(.*(?:\n(?!== {{langue\|[^{}]+}}).*)*)(#+\*) ?'*$

参见 regex demo .

详细信息:

  • (?m)^ - 一行的开始
  • == - 文字串
  • {{langue\| - {{langue| 字符串
  • ([^{}]+) - 第 1 组:{} 以外的一个或多个字符>
  • }} - }} 字符串
  • (.*(?:\n(?!== {{langue\|[^{}]+}}).*)*) - 第 2 组:a 的其余部分行,然后是不以 == {{langue| 开头的 0 行或多行,然后是 {} 以外的一个或多个字符,以及然后 }}
  • (#+\*) - 第 3 组:一个或多个 #,然后是一个 * 字符
  • ? - 可选空格
  • '* - 零个或多个 ' 字符
  • $ - 行尾。

关于regex - 使用正则表达式获取最短匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66233638/

相关文章:

html - 用空 anchor 匹配所有链接?

javascript - 如何在 Javascript 中使用通配符替换

regex - 在大写/大写字符上拆分字符串

java - 日语字符串的模式匹配在 java 中有问题

Python 正则表达式替换所有模式,除非它位于重复模式旁边

Python正则表达式从字符串中提取数字

regex - 带问号的快速路由正则表达式匹配

regex - 每个正则表达式解析和替换嵌套匹配

javascript - 如何从字符串中删除 `//<![CDATA[` 并使用 javascript 结束 `//]]>`?

java - 使用模式和匹配器查找数字