【问题标题】:How to trim a string using regex?如何使用正则表达式修剪字符串?
【发布时间】:2017-04-14 12:17:04
【问题描述】:

我有这个字母表:{'faa','fa','af'} 我有这个字符串:“faaf”

我有这个正则表达式:“(faa|fa|af)*”,它可以帮助我将字符串与字母表匹配。

如何让 Java 将我的字符串修剪为:{fa,af},这是根据我的字母表编写字符串的正确方法:“faaf”?

这是我的代码:

        String regex = "(faa|fa|af)*";
        String str = "faaf";
        boolean isMatch = Pattern.matches(regex, str);
        if(isMatch)
        {
          //trim the string
            while(str.length()!=0)
            {
                Pattern pattern = Pattern.compile("^(faa|fa|af)(faa|fa|af)*$");
                Matcher mc = pattern.matcher(str);
                if (mc.find())
                {
                     String l =mc.group(1);
                     alphabet.add(l);
                     str = str.substring(l.length());
                     System.out.println("\n"+ l);

                }
            }
        }

感谢 Aaron 帮助我解决了这个问题。

【问题讨论】:

  • 我认为您可以在正则表达式中添加锚点,让正则表达式引擎找出与整个文本匹配的组合
  • 我上面的代码就是这样做的。我想要的是连接起来生成单词的字母
  • 这似乎不是一个好主意,但您可以匹配 ^(faa|fa|af)(faa|fa|af)*$,将第一组添加到令牌列表中,将其从输入字符串中删除,然后返回步骤 1 并缩短输入直到为空
  • 非常感谢亚伦先生!你让我开心。
  • 不客气!我是说这不是一个好主意,因为它在每个标记之后“回溯”,而您只需要在模棱两可的标记上回溯,因此它的执行效率低下。现在,如果您考虑制作自己的解析器必须做的工作,它可能是最有效的解决方案之一;)

标签: java regex string


【解决方案1】:

你需要一个循环。

Pattern pattern = Pattern.compile(regex + "*");
LinkedList<String> parts = new LinkedList<>();
while (!str.isEmpty()) {
    Matcher m = pattern.matcher(str);
    if (!m.matches()) { // In the first loop step.
        break;
    }
    parts.addFirst(m.group(1)); // The last repetition matching group.
    str = str.substring(0, m.start(1));
}
String result = parts.stream().collect(Collectors.joining(", ", "{", "}"));

这利用了匹配 (X)+ 将产生 m.group(1) 最后出现的 X 值。

不幸的是,正则表达式模块没有提供无聊的开放matches,例如重载的replaceAll 带有一个处理单个 MatchResult 的 lambda。

请注意,matches 适用于 整个 字符串。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2017-06-22
    相关资源
    最近更新 更多