【问题标题】:Ending a Regex on a Condition根据条件结束正则表达式
【发布时间】:2012-05-27 20:21:26
【问题描述】:

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

这就是我所拥有的

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

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

示例 Fe2(CH3)2(CH2O)(CH3)

这需要拆分成

Fe2

(CH3)2

(CH2O)

(CH3)

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

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

(C5H5)2

O4

(CH3)

【问题讨论】:

  • 正则表达式是强制性的吗?因为我认为根据需要使用正则表达式拆分字符串不是最佳选择。分隔符似乎始终为(,因此您可以使用indexOf("(")substring 轻松拆分字符串。
  • 拆分是有条件的,取决于 ) 或 )#

标签: java regex string split


【解决方案1】:

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

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());

【讨论】:

    【解决方案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)]
    

    【讨论】:

    • 这很接近,但如果我有 (CH3)2O4(CH3) 那么输出是 (CH3)2O4
    • 你是舒尔吗?对于数据“Fe(C5H5)2O4(CH3)”,我得到 [Fe, (C5H5)2, O4, (CH3)], 那么有什么问题呢?
    • 这是我得到的错误 - java.util.regex.PatternSyntaxException: Look-behind pattern match must have a bounded maximum length near index 25:
    • 奇怪,它的最大长度 \\)[0-9]{1,2}+ 表示 ) 和最大 2 位数字(所以最大长度 = 3),它适用于我的 Java 7
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      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' 等字符串。

      【讨论】:

        猜你喜欢
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        相关资源
        最近更新 更多