使用正则表达式获得最短匹配

  • 本文关键字:正则表达式 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在我的regex中,有三个捕获组:第一个捕获lang代码,第二个捕获其他两个组之间的所有文本,最后一个捕获行首,因为#的数量可以改变。如果可能,我将用{{langue|$1}}$2$3 {{ébauche-exe|$1}}替换匹配的字符串。

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

可以使用

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

参见regex演示。

细节:

  • (?m)^-行起始
  • ==-一个自由字符串
  • {{langue|-{{langue|string
  • ([^{}]+)-组1:除{}以外的一个或多个字符
  • }}- a}}字符串
  • (.*(?:n(?!== {{langue|[^{}]+}}).*)*)-组2:一行的剩余部分,然后是0或多个不以== {{langue|开头的行,然后是{}以外的一个或多个字符,然后是}}
  • (#+*)-组3:一个或多个#和一个*字符
  • ?-可选空间
  • '*- 0个或多个'字符
  • $-行尾

最新更新