检查句子中的字符串顺序

时间:2015-04-15 12:01:22

标签: java string

我想知道某个特定词是否出现在另一个词之前。部分单词不匹配。

一些示例测试:

  

“我的名字是AB,我来自伦敦,我喜欢这里......”

if "from" is before "Hi" -> return false
if "Hi" is before "AB" -> return true

4 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点:

  • 使用indexOf - 这可能是最简单的方法。获取字符串的索引,并进行比较。索引较低的字符串位于另一个字符串
  • 之前
  • 使用正则表达式 - 构造一个与所需顺序的字符串匹配的正则表达式,例如"from.*?Hi"。这种方法可能会使用多个正则表达式。

第一种方法的一个转折是开始在第一个单词的索引加上单词的长度搜索第二个单词,并避免索引比较。通过许多搜索和长字符串,这可以节省一些CPU周期。

注意:根据您可能需要注意Scunthorpe problem的要求,当您对子字符串匹配产生误报时。如果您的要求是"Hi, my friend AB"应该匹配,但"Higher than AB"不应该匹配,那么在单词两端使用\b锚点的正则表达式方法将比操作字符串提供更简单的解决方案索引。上面的"from.*?Hi"正则表达式变为"\\bfrom\\b.*?\\bHi\\b"

答案 1 :(得分:2)

yourString.matches(".*? Hi\\b.*? AB\\b.*")

这将确保您之间有空格,并且您将匹配整个单词。

如果你正在处理拉丁美洲的东西,那么在言语出现之前就会出现这种情况,这是更普遍的

yourString.matches(".*?\\bHi\\b.*?\\bAB\\b.*")

打破这一切

.*? = anything, even the empty string.  Ignore the ? for now.
\\b = a word boundary

所以正则表达式意味着

<anything><word boundary>Hi<word boundary><anything><word boundary>AB<word boundary><anything>

相同
if "Hi" is before "AB" -> return true

将用作

if(yourString.matches(".*?\\bHi\\b.*?\\bAB\\b.*")){
    return true;
}

答案 2 :(得分:0)

您可以查看indexOf(String string),它返回表示子字符串位置的整数,如果未找到则返回-1。您可以使用它来查看哪些字符串优先于另一个字符串。

答案 3 :(得分:0)

您可以使用indexOf方法获取每个单词的第一个匹配项,然后进行检查。例如:

String sentence = "Hi my name is AB, I’m from London and I love it here …";

int fromIndex = sentence.indexOf("from");
int hiIndex = sentence.indexOf("Hi");

if (fromIndex < hiIndex)
    System.out.println("false");
else
    System.out.println("true");

请注意,如果句子中不存在单词,则indexOf将返回-1