在Java中使用Regex进行搜索

时间:2014-08-27 17:41:00

标签: java regex replace

我有一个字符串数组(或ArrayList),如:

strMain = "S1R2G3M1D1N3";

strMain由几个字母组成,后跟数字作为后缀。

我也有一个类似的字符串:

str1 = "S1,,--R2,,,,D3-N3";

我需要查看str1中的每个S1,R2,D3和N3是否是字符串strMain的数组的一部分。 我无法弄清楚如何做到这一点。我想我需要拆分str1这样我只得到"字母后跟数字"成阵列。然后我可以在strMain中检查这些字符串的存在。 谁能建议正则表达式才能分裂? 有没有其他方法我们可以检查存在而不分裂(而是使用正则表达式来搜索存在)

你能告诉我分裂这个的正则表达式吗?

1 个答案:

答案 0 :(得分:2)

此正则表达式可以正常运行:[A-Z][0-9]

示例代码:

String strMain = "S1R2G3M1D1N3";
String str = "S1,,--R2,,,,D3-N3";
Pattern pattern = Pattern.compile( "[A-Z][0-9]" );
Matcher matcher = pattern.matcher( str );
while ( matcher.find() ) {
    if ( strMain.contains( matcher.group() ) ) {
        System.out.println( matcher.group() );
    }
}

给出了这个输出

S1
R2
N3

修改

回应你的评论......

  

有时数字可能不存在。表达是什么?例如:str =“S ,, - R2 ,,,, - N3”将打印“SR2N3”。有时我可能必须包括单点或双点或单引号或两个单引号Ex:str =“S。,, - R2 .. ,,, D3-N3',N3''”将打印S., R2 ..,N3',N3''。这里只有字母是必须的,数字,单点,两点,单引号或两个单引号都是可选的。

String strMain = "S1R2G3M1D1N3";
String str = "S.,,--R2...o,,,D3-N3',N3''";
Pattern pattern = Pattern.compile( "([A-Z][0-9]?)(?:\\.{1,2}|'{1,2})?" );
Matcher matcher = pattern.matcher( str );
while ( matcher.find() ) {
    if ( strMain.contains( matcher.group( 1 ) ) ) {
        System.out.println( matcher.group( 0 ) );
    }
}

给出了这个输出:

S.
R2..
N3'
N3''

[A-Z]是一个大写字母 [0-9]是一个数字 X?是X,一次或零次。那么......
[0-9]?是一个数字,一次或零次。

括号创建一个捕获组,这意味着我们以后可以抓住括号之间匹配的内容......

([A-Z][0-9]?)将捕获一个大写字母和可选的一个数字。

然后匹配点和单引号......

X{Y,Z}表示匹配X,在Y和Z之间,所以...
X{1,2}表示匹配X,介于1到2次之间 X|Y表示匹配X或Y.我用括号括起来,否则整个表达式将被“或”。
\\.表示匹配句点。您不能只使用.,因为它具有特殊含义,即任何一个字符。因此,您必须使用\来转义它,它本身也必须使用另一个转义为java编译器。
(\\.{1,2}|'{1,2})表示匹配一个或两个句点,或一个或两个单引号,并捕获该组 (?:X)意味着不捕捉群体 - 我不关心捕捉这个群体,所以把所有东西放在一起...... (?:\\.{1,2}|'{1,2})? - 匹配一个或两个句点,或一个或两个单引号,并将此匹配完成一次或零次。

然后您可以调用matcher.group(...)来获取捕获的组,从1开始.0表示整个匹配。那么group(1)调用只给我一个字母数字部分,我用它来检查它是否存在。

看看Javadoc:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html