【问题标题】:How to split a string into two considering end of the string with numbers (which is inside the squre brackets)考虑到带有数字的字符串结尾(在方括号内),如何将字符串拆分为两个
【发布时间】:2021-03-26 07:46:15
【问题描述】:

我需要使用正则表达式将字符串分成两个,并使用给定的分隔符。 示例字符串和预期输出如下

testnames[3] ===> testnames,3
3alpha[0] ====> 3alpha, 0
beta[4]value[2] ===> beta[4]value, 2
gama4[23] ===> gama4, 23
tama[2334] ====> tama, 2334
tes[t[ ===> No matches
try[]t ===> No matches

如果每个字符串在输入字符串末尾的方括号内包含数字,则应将其拆分为两个。

谁能告诉我一个正则表达式来做到这一点?

注意: 我找到了正则表达式:"\[(-?\d+)\]$"。 但这只是给了我方括号内的数字,而不是字符串的其余部分

【问题讨论】:

标签: java regex split


【解决方案1】:

您可以将这个贪心匹配替换用于 2 个捕获组:

正则表达式:

^(.*)\[(\d+)\]

替换:

$1, $2

RegEx Demo

Java 代码:

String repl = str.replaceFirst("^(.*)\\[(\\d+)\\]", "$1, $2");

RegEx 解释:

  • ^:开始
  • (.*): 贪婪匹配捕获组 #1 中的任意字符中的 0 个或多个
  • \[:匹配一个[
  • (\d+):匹配捕获组 #2 中的 1 个或多个数字
  • \]:匹配一个]

【讨论】:

    【解决方案2】:

    Stream 版本:

    import java.util.List;
    import java.util.regex.MatchResult;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class Main {
        public static void main(String[] args) {
            Stream.of(
                        "testnames[3]",
                        "3alpha[0]",
                        "beta[4]value[2]",
                        "gama4[23]",
                        "tama[2334]",
                        "tes[t[",
                        "try[]t"
                    ).forEach(s -> System.out.println(s + " => " + getTokens(s)));  
        }
        static List<String> getTokens(String str){
            return Pattern.compile("(\\w+(?:\\[\\d+\\]\\w+)?)(?=\\[\\d+\\])|(?<=\\[)\\d+(?=\\])")
                            .matcher(str)
                            .results()
                            .map(MatchResult::group)
                            .collect(Collectors.toList());
        }
    }
    

    输出:

    testnames[3] => [testnames, 3]
    3alpha[0] => [3alpha, 0]
    beta[4]value[2] => [beta[4]value, 2]
    gama4[23] => [gama4, 23]
    tama[2334] => [tama, 2334]
    tes[t[ => []
    try[]t => []
    

    regex101 正则表达式的解释:

    Stream版本:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main {
        public static void main(String[] args) {
            String [] arr = {
                        "testnames[3]",
                        "3alpha[0]",
                        "beta[4]value[2]",
                        "gama4[23]",
                        "tama[2334]",
                        "tes[t[",
                        "try[]t"
            };
            
            for(String s: arr) {
                System.out.println(s + " => " + getTokens(s));
            }
        }
        static List<String> getTokens(String str){
            Pattern pattern = Pattern.compile("(\\w+(?:\\[\\d+\\]\\w+)?)(?=\\[\\d+\\])|(?<=\\[)\\d+(?=\\])");
            Matcher matcher = pattern.matcher(str);
            List<String> list = new ArrayList<>();
            while(matcher.find()) {
                list.add(matcher.group());
            }
            return list;
        }
    }
    

    输出:

    testnames[3] => [testnames, 3]
    3alpha[0] => [3alpha, 0]
    beta[4]value[2] => [beta[4]value, 2]
    gama4[23] => [gama4, 23]
    tama[2334] => [tama, 2334]
    tes[t[ => []
    try[]t => []
    

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式替换:

      String input = "beta[4]value[2]";
      String output = input.replaceAll("\\[(\\d+)\\](?!.*\\[\\d+\\])", ", $1");
      System.out.println(input);
      System.out.println(output);
      

      打印出来:

      beta[4]value[2]
      beta[4]value, 2
      

      这里使用的正则表达式模式是\[(\d+)\](?!.*\[\d+\]),它表示:

      \[(\d+)\]      match a number in square brackets AND capture that number in $1
      (?!.*\[\d+\])  then assert that we do NOT find another [num] term
                     this ensures that we only replace the last [num] term
      

      然后我们用逗号替换,后跟空格和捕获的数字。

      【讨论】:

        猜你喜欢
        • 2021-01-19
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 2015-12-14
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多