我正在尝试为维基百科的API响应编写解析器。它真的很杂乱,我已经使用好旧的RegEx来清理大多数东西。但我坚持这个。考虑一个字符串:
var a ="[[December 1]] A triangular [[Conjunction (astronomy)|conjunction]] formed by a new Moon, Venus and Jupiter is a [[Conjunction (astronomy)#2008|prominent sight]] in the evening sky. [[December 2]]";
我希望此字符串中的文字为:
"December 1 A triangular conjunction formed by a new Moon, Venus and Jupiter is a prominent sight in the evening sky. December 2"
我在处理方括号[,]
时遇到问题。我不能只删除它们,因为链接表示如下:
[[Conjunction (astronomy)#2008|prominent sight]]
在这种情况下,我想删除部分" Conjunction(天文学)#2008"因为网页上显示的实际字符串是"突出的视线"。在JavaScript中的一个str.replace(//gi,"")
查询中是否有一种优雅的方法来处理这两种情况?
我这样做a.replace(/\[\[.*\|/gi, "");
并产生:
"prominent sight]] in the evening sky. [[December 2]]"
很明显,我需要将连续的开始和结束括号[[]]
作为模式进行匹配,然后记住我认为的匹配。我不知道如何解决这个问题,但我希望这两个案例是明确的:
[[ normal word ]]
- >正常的话[[ some definition blah |foo bar]]
- > foo bar 答案 0 :(得分:4)
您可以使用String#replace
进行回调并使用以下RegEx
/\[{2}([\w\s()#]+)(?:\|([\w\s]+))?\]{2}/
RegEx说明:
\[{2}([\w\s()#]+)
:
\[{2}
:匹配[[
([\w\s()#]+)
:匹配任何字母数字字符_
,空格,(
,)
和#
一次或多次并将其放入第一个被捕集团。(?:\|([\w\s]+))?\]{2}
:
(?:
:非捕获组\|
:匹配竖线符号|
([\w\s]+)
:匹配字母数字字符,_
和空格一次或多次并放入第二个捕获的组\]{2}
:匹配]]
RegEx Visualization 更易于理解
<强>演示:强>
var regex = /\[{2}([\w\s()#]+)(?:\|([\w\s]+))?\]{2}/g;
var str = "[[December 1]] A triangular [[Conjunction (astronomy)|conjunction]] formed by a new Moon, Venus and Jupiter is a [[Conjunction (astronomy)#2008|prominent sight]] in the evening sky. [[December 2]]";
str = str.replace(regex, function(c, m1, m2) {
return m2 ? m2 : m1;
});
document.body.innerHTML = '<pre>' + str + '</pre>';
&#13;
这个正则表达式不适用于我在问题中提到的字符串,但它适用于我在评论中提出的字符串
&#34;日本岩手县的[[2008年岩手 - 宫城内陆地震| 6.9级地震]]造成12人死亡,400多人受伤。&#34;
您可以使用以下RegEx。
答案 1 :(得分:1)