当前位置: 首页 > 面试题库 >

使用String.split()提取单词对

韩恺
2023-03-14
问题内容

鉴于:

String input = "one two three four five six seven";

是否有一个正则表达式可以同时String.split()抓取(最多)两个单词,例如:

String[] pairs = input.split("some regex");
System.out.println(Arrays.toString(pairs));

结果:

[one two, three four, five six, seven]

这个问题是关于 分割正则表达式的 。这与“找到解决方法”或其他“使其以其他方式工作”解决方案 无关


问题答案:

当前(最近在Java
14上进行了测试)可以使用split(),但在现实世界中不要使用此方法,因为它看起来像是基于错误的,因为Java中的后向应该具有明显的最大长度,但是此解决方案使用\w+不遵守此限制的方法,并且仍然可以以某种方式起作用-
因此,如果此错误将在以后的版本中修复,则该解决方案将停止工作。

而是使用PatternMatcher带有正则表达式的类\w+\s+\w+(除了更安全之外)还避免了将要继承此类代码的人的维护麻烦(请记住“
始终进行编码,就像最终维护您代码的人是知道您所住地的暴力心理变态者 ”) 。

这是你想要的?
(您可以替换\\w\\S包括所有非空格字符,但在这个例子中,我会离开\\w,因为它是更容易阅读正则表达式\\w\\s,然后\\S\\s

String input = "one two three four five six seven";
String[] pairs = input.split("(?<!\\G\\w+)\\s");
System.out.println(Arrays.toString(pairs));

输出:

[one two, three four, five six, seven]

\G是上一场比赛,(?<!regex)是负向回望。

split我们试图

  1. 查找空间-> \\s
  2. 无法预测的-> (?<!negativeLookBehind)
  3. 用一句话-> \\w+
  4. 与先前匹配的(空格)-> \\G
  5. 在它之前-> \\G\\w+

一开始我唯一的困惑是它如何在第一个空间工作,因为我们希望忽略该空间。 重要信息是\\G在开始时匹配String的开始^

因此,在第一次迭代之前,正则表达式在负向后看起来会像,(?<!^\\w+)并且由于第一个空格 确实
^\\w+之前,所以它无法匹配拆分。下一个空格将不会出现此问题,因此将对其进行匹配,并且有关该信息的信息(例如其在String中的 _ 位置_input)将存储在其中,\\G并稍后在下一个负向后搜索中使用。

因此,对于第三个空格,正则表达式将检查之前是否存在匹配的空格\\G和单词\\w+。由于此测试的结果将是肯定的,因此负向后看不会接受它,因此该空间将不匹配,但是第4个空间将不会出现此问题,因为它之前的空间将与存储在其中的空间相同\\G(它将在inputString中具有不同的位置)

另外,如果有人想分开说每个第3个空格,您可以使用此表单基于@maybeWeCouldStealAVan的答案

input.split("(?<=\\G\\w{1,100}\\s\\w{1,100}\\s\\w{1,100})\\s")

可以使用更大的值代替100,而该值至少应为String中最长单词的长度。

我只是注意到,如果我们想与每个奇数分开,例如每个3、5、7 ,我们也可以使用+代替{1,maxWordLength}

String data = "0,0,1,2,4,5,3,4,6,1,3,3,4,5,1,1";
String[] array = data.split("(?<=\\G\\d+,\\d+,\\d+,\\d+,\\d+),");//every 5th comma


 类似资料:
  • 问题内容: 我有大量的实际文本,需要将单词拉出来以输入到拼写检查器中。我想尽可能多 地 提取 有意义的 单词,而不会产生太大干扰。我知道这附近有很多正则表达式忍者,所以希望有人可以帮助我。 目前,我正在使用提取所有字母序列。这是一个很好的近似值,但是它却拖走了很多垃圾。 理想情况下, 我想要一些正则表达式(不一定漂亮或高效),该正则表达式提取由自然词分隔符(例如,等等)定界的所有字母序列,并忽略任

  • 我想读一个文本文件,打印出已知单词前面的单词,比如Java中的xxx。我使用Scanner类用java编写了这段代码。但是这段代码只打印了“xxx”前面的一半单词,而“xxx”前面的一些单词则丢失了。我想知道是什么问题,你能解决这个代码吗。 测试文件包含类似的内容

  • 在我的数据框架中,有一列名为“teams”。它包括城市和球队名称。我想把这个城市拉进另一个纵队。这是数据帧:数据帧示例 我可以使用正则表达式轻松提取列: 然而,在“名称”栏中,对于纽约尼克斯队,它只给了我“New”的值,我想得到“New York”: 结果 那么,我该怎么做呢?如果单元格有2个单词,我该如何从开头只提取一个单词?如果单元格有3个单词,我该如何使用正则表达式从中提取2个单词?

  • 问题内容: 假设您有一个像这样的文本文件:http : //www.gutenberg.org/files/17921/17921-8.txt 有没有人有一个好的算法或开放源代码从文本文件中提取单词?如何获得所有单词,同时避免使用特殊字符,并保留诸如“ it’s”之类的内容… 我在用Java工作。谢谢 问题答案: 这听起来像是正则表达式的正确工作。如果您不知道如何开始,以下是一些Java代码,可以

  • 问题内容: 我正在尝试从文本中提取所有包含指定单词的句子。 但它正在回报我: 代替 : 有什么帮助吗? 问题答案:

  • 问题内容: 在Swift中提取字符串中最后一个单词的方式是什么?因此,如果我有“ Lorem ipsum dolor坐在amet”,请返回“ amet”。最有效的方法是什么? 问题答案: 您可以使用String方法enumerateSubstringsInRange。第一个参数只是传递您的字符串和选项。只需将每个子字符串附加到结果集合中并返回即可。 Swift 5或更高版本 (对于较早的Swift