【问题标题】:Need nested parenthesis for this regex此正则表达式需要嵌套括号
【发布时间】:2013-01-20 17:05:24
【问题描述】:

我有这样的三列数据集

Col1、Col2、Col2

aaa,亚利桑那州 DL 美国,12

bbb,爱达荷州 DL 美国,35

ccc,爱达荷州 DL 美国,28

ddd,威斯康星州 DL 美国,11

eeee,威斯康星州 DL 美国,35

我想要做的是我想提取第二列的第一个单词(什么是州名)并将其放在第一列中。

预期输出:

亚利桑那州,亚利桑那州随机美国,12

爱达荷州,爱达荷州随机美国,35

爱达荷州,爱达荷州随机美国,28

威斯康星州,威斯康星州随机美国,11

我拥有的正则表达式是

^[^,]+,([^ ]+) [^\n]+$

使用 my () 我可以提取状态名称,但是如何获得输出?我想要的是嵌套括号,像这样

^[^,]+,(([^ ]+) [^\n]+)$

然后输出将是 \1,\2

我应该指出我只想使用正则表达式替换。

编辑:

我已经通过使用正则表达式来获取列中的所有状态名称然后合并它来解决它,但我想知道是否有任何高级正则表达式可以在这里使用。

【问题讨论】:

    标签: java regex shell


    【解决方案1】:
    String s = "aaa,Arizona DL USTATES,12";
    
    String st = s.split(",")[1].split(" ")[0];
    s = s.replaceFirst("\\w+\\,", st + ",");
    

    【讨论】:

    • 谢谢你的回答,这不是我要找的,我想知道的是括号是否可以嵌套?
    【解决方案2】:

    带有嵌套括号的正则表达式可以正常工作;您只需要使用StringreplaceFirst 方法并注意Java 使用$ 进行组引用。另请注意,这些组是按照它们在正则表达式中出现的顺序枚举的,因此外部组是$1,因为它首先开始:

    String line = "aaa,Arizona DL USTATES,12";
    String result = line.replaceFirst("^[^,]+,(([^ ]+) [^\n]+)$", "$2, $1");
    // result is "Arizona, Arizona DL USTATES,12"
    

    【讨论】:

    • 这在shell中也可以吗?
    • 应该是,但在我熟悉的 shell 脚本中执行此操作的唯一方法是使用类似 awksedperl 的命令,以及组参考语法会因命令而有所不同。
    • 您可以在 shell 中通过玩 IFS 技巧并添加一些逻辑来处理带有空格的状态名称。不过,这不是正则表达式解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 2014-10-09
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多