【问题标题】:Java regex. How to get 3 different parts of text?Java 正则表达式。如何获取文本的 3 个不同部分?
【发布时间】:2019-09-09 15:41:53
【问题描述】:

我在 java 中有这么长的字符串

23分之200/ Ne7WoRK / 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18> a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a> 03cf334295615f981c47e P>

我想要达到的是:

出价:200

用户名:Ne7WoRK

签名:3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d342a62c45f981cp3

我需要 3 个正则表达式来帮助我获得投标值、用户名和签名的单独字符串。我不确定如何实现这一目标。我尝试使用以下正则表达式来解决这个问题

\b.*/\b

然而,这个正则表达式匹配整个 3 个子部分并给出这个的输出

200/23/Ne7Work/

我不确定如何创建 3 个不同的正则表达式,其中:

  1. 第一个将匹配从字符串开头到第一个“/”符号的任何数字。给字符串 200
  2. 第二个将匹配从第二个“/”符号到第三个“/”符号的任何字符。捐赠 Ne7Work
  3. 第三个应该匹配从第三个“/”到字符串末尾的所有内容。给出长数 - 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d342a621c4f9081c

【问题讨论】:

  • 当您还不知道正则表达式是否是该工作的最佳工具时,您不应该询问有关正则表达式的问题。在这种情况下它们不是,因为一个简单的String.split 就足够了。

标签: java regex regular-language


【解决方案1】:

您可以使用alternation 匹配正斜杠、1+ 位数字和正斜杠或仅匹配正斜杠:

/\d+/|/

Regex demo | Java demo

例如:

String regex = "/\\d+/|/";
String string = "200/23/Ne7WoRK/3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e";
System.out.println(Arrays.toString(string.split(regex)));

结果:

[200, Ne7WoRK, 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e]

【讨论】:

    【解决方案2】:

    您可以使用 ( ) 对表达式进行分组 例如,您将有 3 个分组。

    ^([\d]*)\/([\d]*)\/([a-zA-Z|0-9]*)
    
    • 第 1 组:数字
    • 第 2 组:数字
    • 第 3 组:字母和数字

    【讨论】:

      【解决方案3】:

      你可以拆分它

      String a = "200/23/Ne7WoRK/3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e";
      System.out.println(Arrays.toString(a.split("/")));
      

      结果

      [200, 23, Ne7WoRK, 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e]
      

      然后做一些其他的工作来得到想要的需求

      【讨论】:

        【解决方案4】:

        试试这个:(\d+)\/(?:.+)\/(.+)\/(.+)

        它将为您提供包含 3 个字符串的 3 个组。

        Java 代码如下:

        Matcher matcher = Pattern.compile("(\d+)\/(?:.+)\/(.+)\/(.+)").matcher(yourString);
        if (matcher.find()) {
            String bid = matcher.group(1);
            String username = matcher.group(2);
            String signature = matcher.group(3);
        } else {
            // Malformed String
        }
        

        【讨论】:

        • 您应该使用matcher.match() 而不是matcher.find(),以捕获更多无效字符串。
        猜你喜欢
        • 2021-11-12
        • 2012-02-11
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多