我需要转换包含多个元素(<>,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循环来提取?
正则表达式应该提取第二,第三和第四项,忽略第一,第五和第六项,如果它们出现。
答案 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)])