gpt4 book ai didi

java - 正则表达式对一个符号进行分组并忽略该符号的其他出现

转载 作者:行者123 更新时间:2023-11-30 06:49:33 25 4
gpt4 key购买 nike

对于我正在从事的项目,我必须解析形式为

的字符串列表
Comparing folder1name-folder2name: x

其中 x 是十进制值。我想使用正则表达式模式和匹配器将每一行分组为单独的元素,这样我就可以轻松提取文件夹名称和值(我稍后会用到)。

我构建了以下工作正常的模式

        String pattern = "(Comparing )(.*)(-)(.*)(: )(\\d+\\.\\d+)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(data);
while (m.find()){
String f1 = m.group(2);
String f2 = m.group(4);
String value = m.group(6);
}

当 - 出现在文件夹名称中时会出现问题,因为模式无法分辨文件夹名称的结尾和分隔符 - 的位置。例如

Comparing folder1-name-folder2-name: x
  1. 可以安全地假设,如果文件夹名称中出现短划线,那么两个名称中的短划线数量总是相等的。有没有什么方法可以让模式考虑到这种可能性,而不会将 - 的名称误认为分隔符?

关于存储/读取非常大的字符串的额外问题。

  1. 我正在使用的字符串数据是从命令行操作中获取的,它可能非常长,可能超过数十万个字符(取决于文件夹的数量)。目前,我正在从流程中获取输入流,将其转换为字符串生成器,然后在构建时将其存储为我可以读取的字符串。

    有没有更有效的方法来做到这一点?我是否应该将其作为 StringBuilder 读取和解析?我希望能够快速读取数据,但担心在一个 String 对象中存储这么多数据。我不希望字符串有可能太大。

谢谢

最佳答案

有时候少即是多。我什至不会尝试将所有逻辑插入正则表达式。相反,我只会为文件夹获取一个字符串:

String pattern = "(Comparing )(.*)(: )(\\d+\\.\\d+)";

然后有一些单独的逻辑来拆分文件夹(使用 - 破折号)。这给了你更多的控制权(例如,当有奇数个破折号时,你可以抛出一个异常)并且会让程序更容易理解。

关于第二个问题:
如果这只是一个您自己使用的工具,请使用单个字符串直到失败。

否则,您可能只考虑逐行处理输入:例如得到一行,应用正则表达式,拆分文件夹,例如将其写入另一个文件或其他文件。

关于java - 正则表达式对一个符号进行分组并忽略该符号的其他出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42596383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com