栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

当前(最近在Java
14上进行了测试)可以使用

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

而是使用

Pattern
Matcher
带有正则表达式的类
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
(它将在
input
String中具有不同的位置)


另外,如果有人想分开说每个第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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号