regsub / regex解析tcl中的元素列表

时间:2015-04-28 16:32:11

标签: tcl

我需要转换包含多个元素(<>,abcd1,1,1)的列表的字符串,如下所示。

自:

test={abc([(<>,yifow3,1,1),(abc,yifow3,2,2,20140920,20151021),(<>,yifow3,3,3,20140920,20151021),(<>,yifow3,4,4)])}

要:

abc([(yifow3,1,1),(yifow3,2,2),(yifow3,3,3),(yifow3,4,4)])

我尝试使用下面的abc([])提取regsub内的列表。总是它会在最后有“abc([”在开头和“])”。

regsub -all {(abc\(\[)([a-z0-9\<\>\(\),]+)(\)\])} $test {\2} test2

然后从test2,使用for循环从每个元素(<>,abcd1,1,1)中提取第二,第三,第四项。

有没有简单的方法可以使用regsub / regex而不是for循环来提取?

正则表达式应该提取第二,第三和第四项,忽略第一,第五和第六项,如果它们出现。

2 个答案:

答案 0 :(得分:1)

好的,严格根据你的问题,如果你已经确定字符串以Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { public void eventDispatched(AWTEvent event) { if (event instanceof MouseWheelEvent) { Object source = event.getSource(); if (source instanceof JScrollPane) { JScrollPane scroll = (JScrollPane) source; if (scroll.getName().equals("ComboBox.scrollPane")) { MouseWheelEvent sourceEvent = ((MouseWheelEvent) event); for (MouseWheelListener listener : scroll.getListeners(MouseWheelListener.class)) { listener.mouseWheelMoved(sourceEvent); } sourceEvent.consume(); } } } } }, AWTEvent.MOUSE_WHEEL_EVENT_MASK); 开头并以{{1}结尾,你可以先用正则表达式获取最内层paren中的所有内容}:

abc([

然后你可以循环遍历每个(用逗号分隔,获得第2到第4个元素并将它们连接起来等)。

如果你想保持简单,我认为你不能避免使用循环。你可以跳过几个步骤,我想用更复杂的(不再简单!)正则表达式:

])

此处的正则表达式set test {abc([(<>,yifow3,1,1),(abc,yifow3,2,2,20140920,20151021),(<>,yifow3,3,3,20140920,20151021),(<>,yifow3,4,4)])} set items [regexp -all -inline -- {\([^()]+\)} $test] # (<>,yifow3,1,1) (abc,yifow3,2,2,20140920,20151021) (<>,yifow3,3,3,20140920,20151021) (<>,yifow3,4,4) 匹配如下:

set test {abc([(<>,yifow3,1,1),(abc,yifow3,2,2,20140920,20151021),(<>,yifow3,3,3,20140920,20151021),(<>,yifow3,4,4)])}
set items [regexp -all -inline -- {\([^,()]+((?:,[^,()]+){3})} $test]
set results [lmap {a b} $items {list [string trim $b ,]}]
# yifow3,1,1 yifow3,2,2 yifow3,3,3 yifow3,4,4

我在这里使用lmap(Tcl8.6),这基本上是一种循环。您可以稍微更改它以获取您要查找的字符串:

\([^,()]+((?:,[^,()]+){3})

答案 1 :(得分:1)

regsub -all -expanded {
    \(                        # a literal parenthesis
    [^(,]+ ,                  # 1 or more non-(parenthesis or comma)s and comma
    ( [^,]+ , \d+ , \d+ )     # the 3 fields to keep with commas
    [^)]*                     # 0 or more non-parenthesis chars
    \)                        # a literal parenthesis
} $test {(\1)}

返回

abc([(yifow3,1,1),(yifow3,2,2),(yifow3,3,3),(yifow3,4,4)])