我有一个字符串数组(或ArrayList),如:
strMain = "S1R2G3M1D1N3";
strMain
由几个字母组成,后跟数字作为后缀。
我也有一个类似的字符串:
str1 = "S1,,--R2,,,,D3-N3";
我需要查看str1中的每个S1,R2,D3和N3是否是字符串strMain
的数组的一部分。
我无法弄清楚如何做到这一点。我想我需要拆分str1这样我只得到"字母后跟数字"成阵列。然后我可以在strMain
中检查这些字符串的存在。
谁能建议正则表达式才能分裂?
有没有其他方法我们可以检查存在而不分裂(而是使用正则表达式来搜索存在)
你能告诉我分裂这个的正则表达式吗?
答案 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