2010-06-17 32 views
1

我有一些字符串需要通过RegEx进行匹配。我们有一个Java应用程序,它从配置文件中读取正则表达式,并采用两组字符串,其中的数字在相同的配置中指定。RegEx匹配模式并排除部分字符串

E.g.

CustomAction.523274ca945f.dialogLabel=Executing Custom Code... 

(?m)^(?!#)\s*(\S*)\s*=\s*(\S*.*) 

我需要的是选择第一组“CustomAction.523274ca945f.dialogLabel”,并排除随机字符串在中间,所以我最终的东西,如“CustomAction.dialogLabel”或“匹配CustomAction..dialogLabel“以及任何其他组合,但随机字符串。

我没有我正在使用的java应用程序的源代码。这是一个应用程序的,我可以创造中,我指定一种模式和两组配置文件和应用程序挑选他们

 
pattern: (?m)^(?!#)\\s*([^.=\\s]*)\\.(?:[^.=\\s]*\\.)?([^.=\\s]*)\\s*=\\s*(.*?)\\s*$ 
key_group: 1 
value_group: 2 

我只能指定每个键一组,每一个值。根据这种模式,app选择key_group作为key和value_group作为它的值。

我不想垃圾在中间,因为它是随机的,每次都会改变密钥。

回答

2

两种方法;首先假定你的财产是三项渴望一个简单的更换你的第一个(\ S *)与:

(\S+?)\.\S+?\.(\S+) 

注意我也改变了对* +,因为它没有任何意义有“..”作为属性的一部分,我也使用了非贪婪的限定符,但如果没有它们,它仍然可以正常工作。然后,您可以使用适当的组编号重建调整后的属性。第二种方法假设您的随机字符串是一个十六进制数字(这似乎是)和财产的非随机的部分不包括数字:

((?:\S+.)*)(?:[0-9A-Fa-f]+.)?((?:\S+.?)+) 

所以第一组前应随机皮卡一切数字(包括尾随点)第二组将吃随机数,然后第三组将匹配剩余的字符串(或者如果没有随机数字部分则整个事件)。

编辑

随着问题的更新说明,只有匹配两组我的回答是,这是不可能的。在正则表达式中,没有任何机制可以“擦除”部分匹配。从问题的定义是不包含的关键部分是在其他文本即:普通模式相匹配的中间是:

((a)(?:b)(c)) 

因为我们不能预先或后处理“b”将始终是包含a和c的较大匹配组的一部分,因此它是不匹配的组并不影响较大的组。

+0

嗨,我需要的结果是第一和第三组连接不在不同的组。在我有的应用程序中,我只能指定两个组,一个用于Key,另一个用于值。 – rojanu 2010-06-18 14:20:00

+0

然后我会改变我的答案为“不可能”(见编辑) – 2010-06-21 12:01:54

0

规范还不是很清楚,但这里是我要承担:

  • #在该行的开头评论
  • 的“钥匙”最多可以有3份,由一个立即.
    • 中间部分分离是一个可选的“垃圾”
  • “密钥”是FOLL通过=欠款,那么“值”
  • .=有特殊标记至少要等到“价值”的一部分,在那里那么一切都
  • 允许空格

那么也许格局是这样的工作原理:

String text = 
     " some.stuff.here = blah blah \n" + 
     " awesome.key = { level = 10 } \n" + 
     "# awesome.key = { level = 11 } \n" + 
     " awesome..key = { level = 12 } \n" + 
     " [email protected]#$.)(*&.$%& = a=b=c.d=f "; 

    Pattern p = Pattern.compile(
     "(?m)^(?!#) (key)@(?:[email protected])?(key) = (value) $" 
      .replace("@", "\\.") 
      .replace(" ", "\\s*") 
      .replace("key", "[^.=\\s]*") 
      .replace("value", ".*?") 
    ); 

    Matcher m = p.matcher(text); 
    while (m.find()) { 
     System.out.printf("%s.%s => [%s]%n", 
      m.group(1), 
      m.group(2), 
      m.group(3) 
     ); 
    } 

此打印:

some.here => [blah blah] 
awesome.key => [{ level = 10 }] 
awesome.key => [{ level = 12 }] 
[email protected]#$.$%& => [a=b=c.d=f] 

注意replace方法来生成最终的正则表达式模式;它用于增强整体大图片“模式”的可读性

+0

对不起,我应该更加精确。我正在更新这个问题 – rojanu 2010-06-18 14:41:24