2013-04-07 25 views
1

我有两个字符串“2007 AL PLAIN TEXT 5567(NS)”和“5567”的第二字符串中,我只要提取一组出这两者是5567串的。我如何为此编写一个java正则表达式?格式将是4位数年份,2位数字权限,字符串纯文本,然后我要提取的数字,最后(NS),但问题是除了数字可以是可选的,我该如何写一个正则表达式只能在一个组中捕获数字5567?正则表达式2不同的字符串占可选元素

+2

为什么你需要第二个字符串的正则表达式,如果它已经是你试图提取的东西? – syb0rg 2013-04-07 23:59:52

+0

请参阅:[正则表达式教程](http://www.vogella.com/articles/JavaRegularExpressions/article.html) – Justin 2013-04-08 00:00:12

+0

因为输入可以是一个或另一个,而不是两个。 – Phoenix 2013-04-08 01:06:23

回答

0

您需要使用?量词,这意味着匹配是可选的,“:”团体比赛,但不会创建该group.Here反向引用是代码:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class Regexp 
{ 
    public static void main(String args[]) 
    { 
    String x = "2007 AL PLAIN TEXT 5567 (NS)"; 
    String y = "5567"; 
    Pattern pattern = Pattern.compile("(?:.*[^\\d])?(\\d{4,}){1}(?:.*)?"); 
    Matcher matcher = pattern.matcher(x); 

    while (matcher.find()) 
     { 
     System.out.format("Text found in x: => \"%s\"\n", 
        matcher.group(1)); 
     } 

    matcher = pattern.matcher(y); 

    while (matcher.find()) 
     { 
     System.out.format("Text found in y: => \"%s\"\n", 
        matcher.group(1)); 
     } 
    } 
} 

输出:

$ java Regexp 
Text found in x: => "5567" 
Text found in y: => "5567" 
1

您可以在一行做到这一点:

String num = input.replaceAll("(.*?)?(\\b\\w{4,}\\b)(\\s*\\(NS\\))?$", "$2"); 

假设你的目标是“一个字长度至少为4个字母数字字符”。

+0

波希米亚,我只能使用正则表达式模式,因为它是一个外部配置 – Phoenix 2013-04-08 18:01:20

+0

波希米亚语,普通文本5567(NS).. 5567可能是字母数字。对不起,没有提及..它可能是556app9(NS) – Phoenix 2013-04-08 21:36:21

+0

看看编辑答案更适合你 – Bohemian 2013-04-08 23:53:29