如何解决这个解析正则表达式的wiki链接?

时间:2011-03-26 12:56:12

标签: regex sed wiki

我有一个旧维基,我正在转换为使用Markdown和[[]]维基链接格式的新维基。不幸的是,旧维基真的旧,并且许多生成链接的方式,包括。 CamelCase,单括号([])wiki链接等。

我正在使用sed中的正则表达式进行转换,并使用以下正则表达式将独立的CamelCase链接转换为双括号([[]])wiki链接:

s/([^[|])([A-Z][a-z]+[A-Z][A-Za-z]+)([^]|])/\1\[\[\2\]\]\3/g

不幸的是,上面的一个问题(我试图在现有的单括号wiki链接中没有转换CamelCase,因为两者兼而有之)就是像[BluetoothConnection|UsingBluetoothIndex]这样的东西会被转换为{{1 }}

如何解决此问题并强制匹配更贪婪,因此失败并且在这种情况下不进行替换?如果[BluetoothConnection|Using[[BluetoothInde]]x]增强的正则表达式过于局限,我愿意通过sed代替perl

1 个答案:

答案 0 :(得分:2)

好的,你可以试试这个:

$ echo "UsingBluetoothIndex" | sed -E 's!([^\[\|]?)([A-Z][a-z]+[A-Z][A-Za-z]+)($|\b|[]|])!\1\[\[\2\]\]\3!g'
Output: [[UsingBluetoothIndex]]

$ echo "[BluetoothConnection|UsingBluetoothIndex]" | sed -E 's!([^\[\|]?)([A-Z][a-z]+[A-Z][A-Za-z]+)($|\b|[]|])!\1\[\[\2\]\]\3!g'
Output: [[[BluetoothConnection]]|[[UsingBluetoothIndex]]]

更新:

好吧我相信现在我使用perl's negative look behind directive为你的问题设置正则表达式。所以这就是:

perl -pe 's#(^|\b)((?![|\[])[A-Z][a-z]+[A-Z][A-Za-z]+(?![|\]]))($|\b)#\[\[\2\]\]#g'

echo "BluetoothConnection" | perl -pe 's#(^|\b)((?![|\[])[A-Z][a-z]+[A-Z][A-Za-z]+(?![|\]]))($|\b)#\[\[\2\]\]#g'
Output: [[BluetoothConnection]]

echo "[BluetoothConnection|UsingBluetoothIndex]" | perl -pe 's#(^|\b)((?![|\[])[A-Z][a-z]+[A-Z][A-Za-z]+(?![|\]]))($|\b)#\[\[\2\]\]#g'
Output: [BluetoothConnection|UsingBluetoothIndex]

它所做的只是检查文本是否以“|”开头或'['而不是以|]结尾,然后将其括在[[]]中。