2

我正在寻找一个正则表达式来拆分包含 () 的字符串。

这就是我所拥有的

String regex = "(?=\\()|()"

第一部分是正确的,因此它以“(”开头。我需要第二部分以“)”结尾,但如果“)”后面有数字,则需要以数字结尾。

例如 Fe2(CH3)2(CH2O)(CH3)

这需要拆分为

Fe2

(CH3)2

(CH2O)

(CH3)

“)”后面的数字可以是一位数,也可以是两位数。

例如,我还需要将 Fe(C5H5)2O4(CH3) 拆分为

(C5H5)2

O4

(CH3)

4

4 回答 4

3

更新后的新逻辑:匹配一些字母字符或带括号的内容,后跟可选数字。

final String f = "Fe2(CH3)2O4(CH2O)2(CH3)";
final Matcher m = Pattern.compile("(\\p{L}+|\\(.*?\\))\\d*").matcher(f);
while (m.find()) System.out.println(m.group());
于 2012-05-27T20:55:26.687 回答
2

编辑

希望这对你有用:)

String s="Fe2(CH3)2(CH2O)(CH3)23O4(CH3)";
String[] array=s.split("(?=\\()|(?<=\\)[0-9]{1,2}+)");
System.out.println(Arrays.toString(array));
//out: [Fe2, (CH3)2, (CH2O), (CH3)23, O4, (CH3)]
于 2012-05-27T21:01:36.860 回答
1

我不知道 java-regex 特定的东西,但这在.net中对我有用:(未
(^[A-Za-z0-9]+)|(\([A-Za-z0-9]+\)[A-Za-z0-9]{0,2})
转义,\在需要的地方添加额外的......)

编辑:现在我已经阅读了你正在做的事情。我的正则表达式不适用于 SPLITTING,而是您应该调用match它。每场比赛对你来说都是一件。

如果这不能完全满足您的要求,请指定更多输入和所需输出(尤其是此未涵盖的输出),我非常乐意提供帮助...

于 2012-05-27T20:29:52.220 回答
1

看起来我找到了适用于所有情况的解决方案:

Enter your regex: \(.*?\)[0-9]{0,2}|[\w]+
Enter input string to search: Fe2(CH3)2O4(CH2O)(CH3)
I found the text "Fe2" starting at index 0 and ending at index 3.
I found the text "(CH3)2" starting at index 3 and ending at index 9.
I found the text "O4" starting at index 9 and ending at index 11.
I found the text "(CH2O)" starting at index 11 and ending at index 17.
I found the text "(CH3)" starting at index 17 and ending at index 22.

这是代码中要使用的正则表达式:

String regEx = "\\(.*?\\)[0-9]{0,2}|[\\w]+";

简而言之,它会查找以 '(' 开头并以 ')' 和数字结尾的字符串。如果那不存在,那么它会查找 'Fe2' 、 'O4' 等字符串。

于 2012-05-27T21:16:08.830 回答