【问题标题】:Match consecutive single characters as whole word将连续的单个字符匹配为整个单词
【发布时间】:2016-01-31 14:40:18
【问题描述】:

从字符串列表中过滤时,我想将连续的单个字符作为整个单词进行匹配

例如下面的字符串

'm g road'
'some a b c d limited'

在第一种情况应该匹配,如果用户键入

"mg" or "m g" or "m g road" or "mg road"

第二种情况如果用户输入应该匹配

"some abcd" or "some a b c d" or "abcd" or "a b c d"

我该怎么做,我可以使用正则表达式来实现吗?

我现在可以使用逐个搜索单词来处理整个单词的顺序,但不确定如何将连续的单个字符视为单个单词

例如"mg road""road mg" 我可以通过搜索 "mg""road" 一个来处理一个

编辑

为了让需求更清晰,下面是我的测试用例

@Test
public void testRemoveSpaceFromConsecutiveSingleCharacters() throws Exception {
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("some a b c d limited").equals("some abcd limited"));
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("m g road").equals("mg road"));
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("bank a b c").equals("bank abc"));
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("bank a b c limited n a").equals("bank abc limited na"));
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("c road").equals("c road"));
}

【问题讨论】:

  • 您可以通过.replaceAll("(?<=\\b\\w) +(?=\\w\\b)","") like in this demo(单击Java)去除被空格包围的单个字母中的空格。对两者都执行此操作:stringtocheck 和 userinput。检查stringtocheck .contains userinput.
  • @bobblebubble 是的,它起作用了.. 谢谢,你能把它添加为答案

标签: java regex string


【解决方案1】:

1.) 从 stringtocheckuserinput 中去除被空格包围的单个字母中的空格。

.replaceAll("(?<=\\b\\w) +(?=\\w\\b)","")

See demo at regexplanet (click Java)

2.) 检查是否 stringtocheck .contains userinput.

【讨论】:

    【解决方案2】:

    听起来您只是想忽略空白。在查找匹配项之前,您可以通过从目标字符串和用户输入中去除空格来轻松做到这一点。

    【讨论】:

    • 是的,可以工作..但我想在第一种情况下匹配“road mg”和“road m g”..意味着我想将连续的单个字符视为一个单词
    • @Akhil - 啊。您没有在最初的帖子中提出乱序词的可能性。所以用户输入的“road mg”应该匹配,但是“road g m”呢?甚至是“公路通用汽车”?
    • 对不起,不清楚的要求,我现在已经添加了我的测试用例
    • @Akhil - 您的测试用例没有按照您在此处的第一条评论中描述的方式重新排序单词的示例。要求还不是很清楚。我的“road g m”或“road gm”的例子呢?
    • 是的,一旦我有像“mg road”或“road mg”这样的字符串,我将在单独的逻辑中处理,我将分别搜索“mg”和“road”,我在我的邮政。 @bobblebubble 建议的正则表达式适用于我提到的测试用例,他在 cmets 部分提到 .replaceAll("(?
    【解决方案3】:

    您基本上希望修改每个搜索词以允许插入空格,所以

    "abcd" becomes regex "\ba ?b ?c ?d\b"
    

    要实现这一点,请在匹配之前对每个单词执行此操作:

    word = "\\b" + word.replaceAll("(?<=.)(?=.)", " ?") + "\\b";
    

    断词\b 是停止匹配"comma bcd""abc duck" 所必需的。

    【讨论】:

      【解决方案4】:

      此正则表达式将匹配由一个或多个空格分隔的所有单个字符

      (^(\w\s+)+)|(\s+\w)+$|((\s+\w)+\s+)
      

      【讨论】:

        【解决方案5】:

        以下正则表达式(在多行模式下)可以帮助您:

        ^(?<first>\w+)(?<chars>(?:.(?!(?:\b\w{2,}\b)))*)
        # assure that it is the beginning of the line
        # capture as many word characters as possible in the first group "first"
        # the construction afterwards consumes everything up to (not including)
        # a word which has at least two characters...
        # ... and saves it to the group called "chars"
        

        您只需要替换第二组中的空格(又名“chars”)。
        查看演示 on regex101.com

        【讨论】:

        • @Akhil:为什么不呢?
        • "m g road" 给出第一个 [0-1] mchars [1-3] `g`
        【解决方案6】:
        str = str.replaceAll("\\s","");
        

        【讨论】:

        • 我有其他要求,搜索词中的单词排序,请检查问题的最后部分
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多