【问题标题】:How do I stop regex after finding "Message: "?找到“消息:”后如何停止正则表达式?
【发布时间】:2019-07-17 18:34:26
【问题描述】:

我将 JSON 消息的正文与正则表达式“:|\n”分开并将值存储到一个数组中。一旦发现“消息:”,我想获得帮助,阻止我的正则表达式拆分消息。

在 JSON 正文中,每个部分由一个新行分隔,因此正文看起来类似于:

{"body": "姓名:Alfred Alonso\n公司:null\n电子邮件:123@abc.com\n电话号码:123-456-9999\n项目类型:现有\n联系方式:电子邮件\n时间范围:1 以内月\n留言:您好,\n这是我的留言。\n谢谢您,\nJohn Doe"}

当用户没有在消息中创建新行时,下面的代码可以完美运行,因此整个消息将存储为一个数组值。

感谢任何可以帮助我解决此问题的人!

String[] messArr = body.split(":|\n");

    for (int i = 0; i < messArr.length; i++)
        messArr[i] = messArr[i].trim();

    if ("xxx".equals(eventSourceARN)) {

        name = messArr[1];

        String[] temp;
        String delimiter = " ";

        temp = name.split(delimiter);
        name = temp[0];
        String lastName = temp[1];

        company = messArr[3];
        email = messArr[5];
        phoneNumber = messArr[7];
        projectType = messArr[9];
        contactBy = messArr[11];
        timeFrame = messArr[13];
        message = messArr[15];

我愿意

messArr[14] = "Message"
messArr[15] = "Hello, This is my message. Thank you, John Doe"

这就是我得到的 [...,留言,你好,这是我的留言。谢谢你,John Doe]。

messArr[14] = "Message"
messArr[15] = "Hello,"
messArr[16] = "This is my message."
messArr[17] = "Thank You,"
messArr[18] = "John Doe"

【问题讨论】:

  • 如果你要解析 JSON,我建议使用合适的 JSON 解析器。
  • 使用json解析器更好
  • @mrzasa 我正在使用 Jackson 的 ObjectMapper。
  • 或者你可以先用文本“消息”分割,然后处理剩下的文本
  • 你可以技术上做类似body.substring(body.indexOf("Message:") + "Message:".length() + 1, body.length() - 2)的事情。 ...但不要这样做。真的应该使用 JSON 解析器。

标签: java json regex


【解决方案1】:

您可以使用find 循环来代替split,例如

Pattern p = Pattern.compile("([^:\\v]+): |((?<=Message: )(?s:.*)|(?<!$).*)\\R?");
List<String> result = new ArrayList<>();
for (Matcher m = p.matcher(input); m.find(); )
    result.add(m.start(1) != -1 ? m.group(1) : m.group(2));

测试

String input = "Name: Alfred Alonso\n" +
               "Company: null\n" +
               "Email: 123@abc.com\n" +
               "Phone Number: 123-456-9999\n" +
               "Project Type: Existing\n" +
               "Contact by: Email\n" +
               "Time Frame: within 1 month\n" +
               "Message: Hello,\n" +
               "This is my message.\n" +
               "Thank You,\n" +
               "John Doe";

Pattern p = Pattern.compile("([^:\\v]+): |((?<=Message: )(?s:.*)|(?!$).*)\\R?");
List<String> result = new ArrayList<>();
for (Matcher m = p.matcher(input); m.find(); )
    result.add(m.start(1) != -1 ? m.group(1) : m.group(2));
for (int i = 0; i < result.size(); i++)
    System.out.println("result[" + i + "]: " + result.get(i));

输出

result[0]: Name
result[1]: Alfred Alonso
result[2]: Company
result[3]: null
result[4]: Email
result[5]: 123@abc.com
result[6]: Phone Number
result[7]: 123-456-9999
result[8]: Project Type
result[9]: Existing
result[10]: Contact by
result[11]: Email
result[12]: Time Frame
result[13]: within 1 month
result[14]: Message
result[15]: Hello,
This is my message.
Thank You,
John Doe

解释

  • 匹配以下之一:
    • ( 开始捕获#1
      • [^:\v]+ 匹配一个或多个不是: 或换行符的字符
    • ) 结束捕获#1
    • : 匹配,但不捕获 : 和空格 (SO 隐藏在这里)
  • | 或:
    • ( 开始捕获#2
      • 匹配以下之一:
        • (?&lt;=Message: )(?s:.*) 其余输入,即所有文本,包括换行符,如果文本前面紧跟“消息:”
      • | 或:
        • (?!$) 如果我们已经在输入结束,则不匹配
        • .* 匹配 0 个或更多字符直到行尾,不包括 EOL
    • )结束捕获#2
    • \\R? 匹配但不捕获可选的换行符。这不适用于Message 文本,如果没有Message 文本并且在最后一个值之后没有换行符,则这是可选的

【讨论】:

    【解决方案2】:

    如果你愿意,你可以做你正在做的事情,然后再把事情放在一起。当你修剪时,注意它在哪里显示消息,然后知道消息在下一个插槽和更远的位置。然后将其重新组合在一起。

    int messagePosition = -1;
    for (int i = 0; i < messArr.length; i++){
        messArr[i] = messArr[i].trim();
        if (i>0 && messArr[i-1].equals("Message")){
            messagePosition =i;
        }
    }
    if (messagePosition > -1){
        for (int i=messagePosition+1; i <messArr.length; i++){
            messArr[messagePosition]=messArr[messagePosition]+" "+messArr[i];
        }
    }
    

    一个缺点是,因为数组是固定大小的,所以您需要表现得好像除了 messagePosition 之外什么都没有。因此,任何长度计算都会产生误导。如果出于某种原因您担心会查看超出的插槽,您可以在连接步骤之后将 messArr[i]=""; 添加到第二个 for 循环中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多