【问题标题】:Regex multiple occurrences in string line正则表达式在字符串行中多次出现
【发布时间】:2018-07-04 19:53:30
【问题描述】:

我必须匹配用户定义的%variable% 格式的一些子字符串。

在文中这种情况可能是错误的:

abcd`%variabl%e%`abcd`%variable%`abcd

%[^%]+% 这样的简单正则表达式匹配错误的值:

%variabl%
%abcd%

我只想让 %variable% 忽略 %variable%e% 和其他无效匹配。

PS: %variable1% 和 %variable2% 可能在同一行,我必须同时匹配它们。

有没有办法在不增加正则表达式复杂性的情况下做到这一点。

【问题讨论】:

  • 预期输出是什么?对图案有什么要求?
  • 可能你想要%[^%]+(?=%)
  • 我可以推荐Regex101让你更容易测试,它还显示了你的正则表达式的解释。
  • 我看起来,而不是匹配模式,您想搜索一组特定的值。你确定正则表达式是适合这项工作的工具吗?
  • 如果您要求获取%variabl%, %e%, %abcd%, %variable%,请注意这些是重叠匹配,这是正则表达式中的常见问题。你的正则表达式风格是什么?如果您想在 Oracle 中执行此操作,则不能仅使用 regexp_substr,因为 Oracle 正则表达式引擎是基于 POSIX 的并且不支持环视。请用适当的语言标签标记问题,否则不清楚。

标签: regex substring


【解决方案1】:

由于您在问题中标记了substring,因此这是使用indexOf()substring() 的非正则表达式方法

public class MyClass {
    public static void main(String args[]) {
        String data = "abcd%variabl%e%abcd%variable%abcd";

        int firstIndex = data.indexOf("%");
        int nextIndex = data.indexOf("%", firstIndex + 1);

        while (nextIndex > -1) {
            System.out.println(data.substring(firstIndex, nextIndex + 1));
            firstIndex = nextIndex;
            nextIndex = data.indexOf("%", firstIndex + 1);
        }
    }
}

结果:

%variabl%
%e%
%abcd%
%variable%

更新

如果你只想要纯正则表达式

(?<=%)[^%]+%

此模式将为您提供相同的结果,但每个匹配结果中都没有开头 %

Regex101

和@revo 模式%[^%]+(?=%) 将有相同的结果,但每个匹配结果都没有结尾%

Regex101

【讨论】:

  • 使用子字符串的 OP 标记,可以用 Java、C#、C++、VB .NET 等来完成...我刚决定使用 Java。
  • 我不会投反对票,因为在我看来这实际上是一个很好的答案,但请注意它可能无法回答问题,如果事实证明 OP 使用的是您使用的任何其他语言提到(甚至是甲骨文,正如 Wiktor 指出的那样)。
  • 我之所以提到 Oracle,是因为 OP 在历史上曾有过用 Oracle 标记的帖子,而substring 是在涉及字符串操作时用于 SQL 相关问题的常用标记。
猜你喜欢
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多