Java 将连续的单个字符作为整个单词进行匹配

Java 将连续的单个字符作为整个单词进行匹配,java,regex,string,Java,Regex,String,从字符串列表中筛选时,我希望将连续的单个字符作为整个单词进行匹配 e、 g.字符串以下 '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" 我如何做到这一点,我可以用正则表达式实现吗 我现在可以通过逐个搜索单词来处理整词的顺序,但

从字符串列表中筛选时,我希望将连续的单个字符作为整个单词进行匹配

e、 g.字符串以下

'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"
我如何做到这一点,我可以用正则表达式实现吗

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

e、 g.“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"));
}

听起来你只是想忽略空白。在查找匹配项之前,您可以通过从目标字符串和用户输入中去掉空白来轻松完成此操作。

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

str = str.replaceAll("\\s","");
^(?<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"
^(?\w+(((?!(?:\b\w{2,}\b)))*)
#确保它是生产线的起点
#在第一组“first”中捕获尽可能多的单词字符
#之后的施工消耗了(不包括)以下的一切
#至少有两个字符的单词。。。
# ... 并将其保存到名为“chars”的组中
您只需要替换第二组中的空格(也称为“chars”)。

查看演示

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

"abcd" becomes regex "\ba ?b ?c ?d\b"
要实现此目的,请在匹配之前对每个单词执行以下操作:

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

word=“\\b”+word.replaceAll((?此正则表达式将匹配由一个或多个空格分隔的所有单个字符

(^(\w\s+)+)|(\s+\w)+$|((\s+\w)+\s+)
1.)从stringtocheck和userinput中去掉单个字母周围的空格


.replaceAll(“(?是的,这可以工作。)但我想在第一种情况下匹配“road mg”和“road mg”。这意味着我想将连续的单个字符视为一个字符word@Akhil-啊。你在最初的帖子中没有提到出现顺序错误的可能性。所以用户输入的“road mg”应该匹配,但是“road g m”或者“road gm”呢?很抱歉没有明确的要求,我已经在中添加了我的测试用例question@Akhil-您的测试用例没有按照您在这里的第一条评论中描述的方式重新排列单词的示例。要求仍然不清楚。我的“road g m”或“road gm”示例如何?是的,一旦我有了像“mg road”或“road mg”这样的字符串,我将分别搜索“mg”和“road”,我在我的帖子中提到了这一点。@BobbleBobble建议的正则表达式为我处理提到的测试用例,他在评论部分提到。replaceAll(“(?我还有其他要求,搜索词中的单词顺序,请检查question@Akhil:为什么不呢?“m g road”首先给出[0-1]
m
chars[1-3]`g`你可以去掉由
.replaceAll((?@bobblebubble)包围的单个字母中的空格。(?@bobblebubble)是的,成功了。。谢谢,你能把它添加为答案吗
.replaceAll("(?<=\\b\\w) +(?=\\w\\b)","")