当前位置: 首页 > 知识库问答 >
问题:

字符串中的子字

凌照
2023-03-14
    null
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<String> s = new ArrayList();
for (int i = 0; i <= n; i++)
{
    String st = sc.nextLine();
    s.add(st);
}

int q = sc.nextInt();

for (int i = 0; i<q;i++)
{
    int count = 0;
    String st = sc.nextLine();
    String check = "\\w"+st+"\\w";
    Pattern p = Pattern.compile(check);
    for (int j = 0; j < n; j++)
    {
       Matcher m = p.matcher(s.get(j));
       while (m.find())
       {
           count += 1;
       }
   }

   System.out.println(count);
}

有人能帮我弄清楚为什么上面的代码给出了错误的答案吗?

共有1个答案

丰胤运
2023-03-14

这里要提两件事:

  • nextint()的调用不使用换行符,您必须显式调用nextline()或抓取整行并转换为int(此处对此进行解释)
  • regex将不匹配模式的连续出现(就像ISIS中的两个is),您需要将\\\w替换为\\b(非单词边界)。

请参见一个固定的代码片段:

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine(); // Force it to consume the line break
ArrayList<String> s = new ArrayList();
for (int i = 0; i < n; i++)
{
    String st = sc.nextLine();
    s.add(st);
}

int q = sc.nextInt();
sc.nextLine(); // Force it to consume the line break
for (int i = 0; i < q; i++)
{
    int count = 0;
    String st = sc.nextLine();
    String check = "\\B" + st + "\\B";
    Pattern p = Pattern.compile(check);
    for (int j = 0; j < n; j++)
    {
       Matcher m = p.matcher(s.get(j));
       while (m.find())
       {
           count += 1;
       }
   }
   System.out.println(count); // => 3
}
 类似资料:
  • 问题内容: 有没有一种简单的方法来测试Python字符串“ xxxxABCDyyyy”,以查看其中是否包含“ ABCD”? 问题答案: if “ABCD” in “xxxxABCDyyyy”: # whatever

  • 问题内容: 我曾经在JavaScript中这样做: Swift没有此功能,如何做类似的事情? 问题答案: 编辑/更新: Xcode 11•Swift 5.1或更高版本 用法: 不区分大小写的样本 正则表达式样本

  • 问题内容: 为什么以下算法对我来说不停止?(str是我要搜索的字符串,findStr是我要寻找的字符串) 问题答案: 最后一行造成了问题。永远不会为-1,所以会有无限循环。可以通过将代码的最后一行移到if块中来解决此问题。

  • 本文向大家介绍替换Java字符串中的子字符串,包括了替换Java字符串中的子字符串的使用技巧和注意事项,需要的朋友参考一下 假设以下是我们的字符串。 我们想将子字符串“ Dead”替换为“ Alive”。为此,让我们使用以下逻辑。在这里,我们使用了while循环,并在其中找到了要替换的子字符串的索引。这样,我们一个接一个地替换了整个子字符串。 以下是替换子字符串的完整示例。 示例 输出结果

  • 例如,我们有一个字符串:asd/asd/asd/1#s_ 我需要匹配以下部分:/asd/1#s_或asd/1#s_如何使用普通正则表达式? 我试过像这样的消极前瞻,但它不起作用 它匹配这个“前缀/asd/1#s_”,我需要匹配“/asd/1#s_”中的这个“/asd/1#”,我需要匹配“/asd/1#s_”,而没有所有前面的 /asd/'s 匹配应该与普通正则表达式没有任何编程语言的任何帮助函数h

  • 问题内容: 我想替换列中的子字符串 到。 需求输出 我尝试,但它返回。 问题答案: 使用与更换和: