2011-11-25 90 views
0

正确的正则表达式我有一个FileInputStream谁读这某处包含字符串子集看起来像一个文件:形成动态字符串

... 
    OperatorSpecific(XXX) 
    { 
     Customer(someContent) 
     SaveImage() 
     { 
... 

我想识别字符串的Customer(someContent)部分和开关内部的somecontent写入别的东西的括号。

someContent将是一个动态参数,并将包含一个可能的5-10个字符的字符串。

我以前曾经使用regEx,就像一次或两次,但我觉得在这种情况下,我不知道括号内的值是什么,我不知道该如何表达它...

总之,我想要一个返回给我的字符串,它具有Customer-parenthesis中的我的someContent值。

有没有人有任何明智的想法,如何做到这一点?

回答

1

试试这个(在java中使用的双反斜杠!)

(?<=Customer\()[^\)]* 

并用您的内容替换。

看到它here at Regexr

(?<=Customer\()是看背后的断言。它在每个位置检查是否存在“客户(”在左边,如果是,则在右边匹配所有不是“)”的字符与[^\)]*,则这是将被替换的部分。

一些可以使用的Java代码

Pattern p = Pattern.compile("(?<=Customer\\()[^\\)]*"); 
String original = "Customer(someContent)"; 
String Replacement = "NewContent"; 

Matcher m = p.matcher(original); 
String result = m.replaceAll(Replacement); 

System.out.println(result); 

这将打印

客户(NewContent)

+0

+1尼斯工具,并且您对表达式如何工作给出了很好的解释。 – AndroidHustle

0

未经检验的,但是像下面应该工作:

Pattern pattern = Pattern.compile("\\s+Customer\\(\\s*(\\w+)\\s*\\)\\s*"); 
Matcher matcher = pattern.matcher(input); 
matcher.matches(); 

System.out.println(matcher.group(1)); 

编辑

这当然不会与所有可能的情况下工作:

// legal variable names 
Customer(_someContent) 
Customer($some_Content) 
0

使用组工作和非贪婪的作品:

String s = 
    "OperatorSpecific(XXX)\n {\n" + 
    "  Customer(someContent)\n" + 
    "  SaveImage()  {"; 
Pattern p = Pattern.compile("Customer\\((.*?)\\)"); 
Matcher matcher = p.matcher(s); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

将打印

someContent