【问题标题】:Split word by character count or last index of non-word character按字符数或非单词字符的最后索引拆分单词
【发布时间】:2017-02-28 03:01:55
【问题描述】:

我有这样的字符串:

aaaaaas#aa##aa

我想使用split() 和正则表达式来完成这个算法:

  • 获取前 5 个字符
  • 如果有非单词字符,切到最后一个非单词字符,包括非单词字符
  • 如果没有非单词字符,就删掉这5个字符
  • 从最后一个剪辑重复直到字符串结束

这个例子的返回应该是这样的:

aaaaa
as#
aa##
aa

甚至可以使用正则表达式和split()?这个

.*([\W]+)\W

给我最后一个非单词字符的字符(例如,它将是aaaaaas#aa##)但是如何将它分组到最大值。 5 个字符,拆分并从上一场比赛结束继续?

https://regex101.com/r/xA9kG3/14

【问题讨论】:

  • 输入 a#a#a#a# 是否拆分为 a#a#a#a#,还是拆分为 a#a#a#a#?项目符号 1 说 “获得 5 个字符”,即a#a#a,然后项目符号 2 说 “切到 最后一个 非单词字符” ,即a#a#。但是你的意思是在a#之后删减吗?
  • 在我(现已删除的答案)aa#####aa should output aaa##, ##aa, because last word is shorter then 5 characters, sory, I didn't mentioned it. So I should add bullet: if splitted word is last 5 characters or shorter then 5 characters (so they are last characters in string) return it987654340@下的OP评论
  • 老实说,您的问题看起来像X/Y problem。您给了我们一些步骤,但我们仍然不知道有什么意义?也许您正在寻找类似的东西:stackoverflow.com/questions/25853393/…?

标签: java regex


【解决方案1】:

甚至可以使用正则表达式和split()?

是的,但是完全实现您所描述的内容非常混乱。请特别注意,您的规范描述了您想要接受的子字符串,而split() 则根据匹配分隔符子字符串之间工作。

您仍然可以通过对定界符模式使用零宽度环视断言来做这种事情,但这需要一个又长又丑的正则表达式才能准确地实现您的特定要求。最重要的是,5 个字符的窗口使事情变得一团糟。 Java 正则表达式确实支持特殊的\G 来匹配前一个匹配项(如果有)的尾随边界,这使得这项工作成为可能

这是我想出的最佳模式:

(?x) (?<= \\G\\w{5} )
   | (?<= \\G  .{4} \\W )
   | (?<= \\G  .{3} \\W ) (?= \\w )
   | (?<= \\G  .{2} \\W ) (?= \\w{2} | \\w\\z )
   | (?<= \\G  .    \\W ) (?= \\w{3} | \\w{1,2}\\z )
   | (?<= \\G       \\W ) (?= \\w{4} | \\w{1,3}\\z )

(请注意,启用 cmets 模式可以使模式中的空格变得无关紧要。)

对于自上次匹配后隐式跟随五个单词字符的分隔符,有一种替代方法,对于以非单词字符结尾的标记,每个可能的标记长度都有一种选择。我顺便观察到,在这种情况下,分隔符不一定落在第一个非单词/单词边界处,也不一定在这样的边界处,而是在考虑的时间的五个非单词字符之后。此外,在最后一个标记之后没有必要存在分隔符。

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多