我正在使用Javascript处理Mediawiki标记。我试图删除某些参数。我无法完全找到要删除的文本和文本。
简化,模板文本可能如下所示:
{{TemplateX
| a =
Foo bar
Blah blah
Fizbin foo[[domain:blah]]
Ipsum lorem[[domain:blah]]
|b =1
|c = 0fillertext
|d = 1alphabet
| e =
| f = 10: One Hobbit
| g = aaaa, bbbb, cccc, dddd
|h = 15000
|i = -15000
| j = Level 4 [[domain:filk|Songs]]
| k =7 fizbin, 8 [[domain:trekkies|Shatners]]
|l =
|m =
}}
到目前为止,我提出的最好的是
<击> / \ | \ S(A | B | d | F |百灵| K | M)?([^] [^ \ n \ |])+ /克击>
更新版本:
/\|\s?(a|b|d|f|j|k|m)(?:[^\n\|]|[.\n])+/gm
给出(使用更新的正则表达式):
{{TemplateX
|c = 0fillertext
| e =
| g = aaaa, bbbb, cccc, dddd
|h = 15000
|i = -15000
|Songs]]
|Shatners]]
|l =
但我想要得到的是:
{{TemplateX
|c = 0fillertext
| e =
| g = aaaa, bbbb, cccc, dddd
|h = 15000
|i = -15000
|l =
}}
我可以处理无关的新行,但我仍然需要确保&#39; | Songs]]&#39;和&#39; | Shatners]]&#39;也与正则表达式相匹配。
关于Tgr的评论,
出于我的目的,可以安全地假设每个参数都从一个新行开始,其中|是该行的第一个字符,并且没有参数定义包含|这不在[[foo | bar]]构造中。所以&#39; \ n |&#39;是一个安全的开始&#34;并且&#34;停止&#34;序列。所以问题归结为,对于任何给定的参数(问题中的a,b,d,f,j,k和m),我需要一个匹配&#39;想要参数的正则表达式。在下面:
| [other param 1] = ...
| [wanted param] = possibly multiple lines and |s that aren't after a newline
| [other param 2]
答案 0 :(得分:2)
您可以尝试以下操作 - 它匹配您要包含的变量,而不是您要排除的变量:
(^{{TemplateX)|\|\s*(c|e|g|h|i|l[ ]*\=[ ]*)(.*)|(}}$)
我将其增强到了这一点,如果你在regexper.com上使用图表工具比较两个正则表达式,我认为会更好一些:
(^{{TemplateX)|(\|[ ]*)(c|e|g|h|i|l)([ ]*\=[ ]*)(.*)|(}}$)
除了评论之外,匹配不需要的参数的正则表达式是这样的:
\|[ ]?(a|b|d|f|j|k|m)([ ]*\=[ ]*)((?![\r\n]+\|)[0-9a-zA-Z, \[\]:\|\r\n\t])+
利用此answer - 它使用否定前瞻仅匹配[\r\n]+\|
,这将部分满足以下声明:
所以'\ n |'是一个安全的“开始”和“停止”序列
Tested here在要保留的参数中引入了一些换行符(例如g
)。
视觉解释:
存在使用
以外的字符的参数值的风险[0-9a-zA-Z, \[\]:\|\r\n\t]
要解决此问题,您需要更新该列表。
答案 1 :(得分:0)
试图考虑模板语言的完全灵活性是没有希望的。例如,模板可能看起来像
{{TemplateX
| a=1 | b=2 }}
或
{{TemplateX|
| a=1 <nowiki>|</nowiki> b=2 }}
完全不同(第一个参数有a
和b
,第二个参数是a
个参数。正则表达式(大部分)是无上下文的,无法掌握这样的结构。
因此,除非您确定模板总是按照相同的约定使用,否则最好使用一些适当的解析器,例如mwparserfromhell:
import mwparserfromhell
wikicode = mwparserfromhell.parse(text)
for template in wikicode.filter_templates(recursive=True, matches=lambda t: t.name.strip() == 'TemplateX'):
for param in ['a', 'b', 'd', 'f', 'j', 'k', 'm']:
template.remove(param)
print(wikicode)
(这需要在Python中重写代码或调用Python后端服务。我认为Javascript中没有任何好的wiki文本解析器。)
或者,您可以使用parse API和prop=parsetree
来获取模板及其参数的XML树表示,这不是很难处理。