【问题标题】:Regexp for :name, :othername, :other:name, :other name, :other 的正则表达式
【发布时间】:2011-06-03 18:32:50
【问题描述】:

我正在尝试获取字符串中的所有名称,如下所示:

:name, :lastName

但我似乎没有找到正确的方法。

这是我迄今为止尝试过的:

/^(:((\w+)(,:(\w+))+).*)$/

在 Java 中:

Pattern a = Pattern.compile("(:((\\w+)(,:(\\w+))+).*)");
Matcher m = a.matcher(":name,:lastName,:bd");
if( m.matches() ) { 
  for( int i = 0 ; i < m.groupCount() ; i++ ) { 
    out.println( i + " = " + m.group( i ) );
  }   
}

输出:

0 = :name,:lastName,:bd
1 = :name,:lastName,:bd
2 = name,:lastName,:bd
3 = name
4 = ,:bd

我正在尝试获取包含[name, lastName, bd]的可变数量的组

编辑

顺便说一句,我正在尝试使用更复杂的正则表达式来匹配简单的东西,例如:

 insert into table values ( :a, :b, :c )

/insert\s+into\s+(\w+)\s+values\s+(\( HERE IS MY QUESTION \))/

【问题讨论】:

  • @kaj: name, lastName, bd,依此类推(或 group(n) = name, group(n+1) = lastName, group(n+2) = bd, group( n+m)=等)
  • 只是为了澄清:问题是重复匹配 (\\w+)+ 只保留最新匹配,这就是为什么 lastName 似乎被忽略了。我以前不知道这一点。
  • 我猜你应该使用一些标准的正则表达式来验证查询的第一部分(文本部分),然后使用@MarcoS 或@Aku 的方法来处理以“:”开头的位.

标签: java regex language-agnostic


【解决方案1】:

是否要求您将结果放在不同的组中?否则这将起作用:

Pattern a = Pattern.compile(":([^,]+)");
Matcher m = a.matcher(":name,:lastName,:bd");
while (m.find()) {
    System.out.println(m.group(1));
}

编辑:...如果你想得到一个结果数组,你可以使用 split:

String data = ":name,:lastName,:bd";
String[] parts = data.replace(":", "").split(",", -1);
System.out.println(Arrays.toString(parts));

【讨论】:

  • 不,这不是必需的,我只需要以任何方式抓住它们。
【解决方案2】:

也许你想要这个:

public static void main(String[] args) {
    Pattern a = Pattern.compile(":(\\w+)");
    Matcher m = a.matcher("insert into table values ( :a, :b, :c )");
    while (m.find()) {
        System.out.println(m.group(1));
    }
}

哪个输出:

a
b
c

【讨论】:

  • Opps.. 是的,对不起,我正试图把它放在一个更复杂的正则表达式中:P
  • @MarcoS:这里不需要使用find(int) 重载;它适用于特殊情况,您必须在字符串开头以外的地方开始搜索。只要 Matcher 在调用之间没有重置,no-arg find() 方法就保证返回所有可能的非重叠匹配。
  • @Alan Moore:你是对的!谢谢!我更改了我的代码,还使用了m.group(1),它返回没有:的字符串
【解决方案3】:
public static void main(String[] args)
{
    Pattern a = Pattern.compile(":([^,]+)");
    Matcher m = a.matcher(":name,:lastName,:bd");
    while (m.find())
    {
        System.out.println(m.group(1));
    }

}

【讨论】:

    【解决方案4】:

    正则表达式很难。为什么不直接split()呢?

    String inputString = ":name,:lastName,:bd";
    
    for (String s : inputString.split(",?:")) {
        System.out.println(s);
    }
    

    【讨论】:

    • @Oscar 我明白了。我只喜欢将这样的硬块作为组提取并单独杀死它们,而不是尝试将它们全部堆积成正则表达式噩梦的中心质量。感觉就像是“神课”。
    • 我也是,但效果很好:Pattern.compile(":([^,\\s]+)");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2016-04-10
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多