gpt4 book ai didi

java - 模式解析 Java

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

假设我在程序中的目标是尽可能多地解析字符串中出现的 "ab"。我使用以下代码解决这个问题:

public static void main(String[] args)
{
final String expression = "^(\\s*ab)";

Scanner scanner = new Scanner("ab abab ab");

while (scanner.hasNext())
{
String next = scanner.findWithinHorizon(expression, 0);

if (next == null)
{
System.out.println("FAIL");
break;
}
else
{
System.out.println(next);
}
}
}

表达式开头的插入符号是不允许在每次读取的开头使用空格以外的任何内容,如前所述 here .它的存在是为了防止像 "cab""c ab" 这样的东西被允许。事实上,如果发生这两种情况之一,我希望返回 null 并将 FAIL 打印到控制台。如果我从表达式中删除插入符号,它在诸如 "ab abab ab" 之类的输入上工作得很好,但无法为 "c ab" 返回 null。另一方面,如果我离开插入符号,则 "c ab" 会按预期返回 null,但 "ab abab ab" 会失败。我怎样才能使它工作?

编辑

我原来的帖子可能有点含糊。我上面给出的例子是我实际问题的一个简单版本。模式 ab 是一个填充模式,我会用更有趣的东西替换,比如电子邮件地址正则表达式或十六进制值。

在我的应用程序中,扫描仪的输入不是字符串,而是我不知道的输入流。我在循环中的目标是从输入中一次读取一个值并验证它们的内容是否匹配某种模式。如果他们这样做了,那么我可以和他们一起做一些更有趣的事情。如果不是,则程序终止。

在上面的例子中,我希望输入 ab abab ab 输出:

ab
ab
ab
ab

我希望 c ab 输出:

FAIL

我希望 ab cab 输出:

ab
FAIL

最佳答案

在另一个线程中,您想要匹配 ab 的第一次出现,所以插入符号很好。如果你想匹配 ab 的每一次出现直到另一个字符出现,试试这个表达式:String expression = "\\G(\\s*ab)";/p>

\G 表示下一场比赛应该从上一场比赛停止的位置开始。

如果我将它与您的代码一起使用,我会得到以下结果:

  1. 输入 = "ab abab ab", 输出 = "ab", "ab", "ab", "ab"

  2. 输入 = "cab abab ab", 输出 = "FAIL"

  3. 输入 = "ab c abab ab", 输出 = "ab", "FAIL"

  4. 输入 = "ab abab abc", 输出 = "ab", "ab", "ab", "ab", "FAIL"

关于java - 模式解析 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5676938/

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