此正则表达式可以工作:[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.我将其括在括号中,否则整个表达式将进行OR运算。
\\.
表示匹配一段时间。您不能只使用.
,因为它具有特殊含义,即任何一个字符。因此,您必须使用\
来逃避它,它本身也必须通过使用另一个逃脱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
我不明白你在问什么。这似乎是[XY问题](http://xyproblem.info);也许[这](http://stackoverflow.com/a/24656216/3622940)将帮助你。 – Unihedron 2014-08-27 17:47:12
我认为匹配比尝试分割更容易(更好)。 – Jerry 2014-08-27 17:57:02