【问题标题】:Searching for both word and its negation in a string using java regex使用java正则表达式在字符串中搜索单词及其否定
【发布时间】:2014-02-14 02:01:04
【问题描述】:

我想使用 java 在字符串中找到单词及其否定。例如,说

String str = "The product contains no sodium but contains potassium"

我正在此字符串中同时搜索“钠”和“无钠”。我想根据结果采取具体行动。但是,我如何确保一旦在此字符串中识别出“无钠”,钠就不会使用正则表达式获得匹配器。我有一个需要在大量字符串中搜索的此类单词(子字符串)的列表。

现在,我正在使用一个数组列表来存储要匹配的单词和字符串,我正在使用它创建一个用于在输入字符串中搜索的模式

String patternString = "\\b(" + StringUtils.join(wordsSearch,"|") + ")\\b"; //making a pattern to search
Pattern pattern = Pattern.compile(patternString);
//using matcher to find the substrings that I have mentioned earlier
Matcher matcher = pattern.matcher(inputString);

【问题讨论】:

  • 我认为这取决于你认为什么是“否定”。对于具体的示例,\\b((?:no )?sodium)\\b 会做你想做的事,\\b(no sodium|sodium)\\b\\b(sodium|no sodium)\\b 也会这样做。那么您到底在寻找什么?
  • 否定产品含有钠或不含钠。在这种情况下,给定产品描述,我需要确定描述是否包含钠或短语,如不包含钠或不含钠等@Jerry
  • 如果您还没有这样做,请查看 Java RegEx 教程的Greedy, Reluctant, and Possessive Quantifiers 部分。它似乎与您手头的任务相关。
  • @Lazyprogrammer 但这只是让问题突然变得更广泛。 absence of sodium 呢?还有其他许多表示“无钠”的方法?
  • 为了便于阅读,您应该分两步执行此操作。首先搜索“无钠”。如果没有匹配项,则搜索“钠”。此外,请注意分词 - 您不希望“氨基酸”的存在记录“无酸”的命中。

标签: java regex string


【解决方案1】:

匹配器不会找到重叠匹配,因此对于您的示例,这已经可以满足您的需求。但是,如果您有多个具有共同前缀的字符串,例如“sodium”和“sodium chloride”,您可能会遇到一些问题。

为确保您始终获得最长的匹配,请确保您始终在交替中首先拥有较长的字符串。因此,只要您的正则表达式类似于\b(sodium chloride|sodium)\b,正则表达式引擎就会首先尝试sodium chloride,然后在必要时回退到sodium

在这种情况下,您应该在创建正则表达式之前按字符串长度(前面最长)对wordsSearch 进行排序。

【讨论】:

  • 是的,我刚刚意识到这一点,进行了编辑,添加了一些额外的解释。我认为答案对于 OP 正在尝试做的事情仍然有意义。
  • 但仍然只有单词“sodium”会在字符串右侧被识别,因为这样的单词存在由单词边界分隔?如果我错了,请纠正我。 @F.J
  • 一般来说,正则表达式库不会找到重叠匹配。当找到一个匹配时,匹配器将在前一个匹配之后开始寻找下一个匹配,因此当匹配“no sodium”时,匹配器将尝试在“m”之后找到下一个匹配,所以你不会得到“钠”作为单独的匹配项。
【解决方案2】:

如果您只想匹配 no sodium,则照常进行。

但如果你只想匹配 sodium 之前没有 no ,那么它将是

(?<!no) sodium

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2012-03-10
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多