【问题标题】:Ruby: break string into words by capital letters and acronymsRuby:通过大写字母和首字母缩略词将字符串分解为单词
【发布时间】:2021-01-17 18:43:29
【问题描述】:

我需要用大写字母和首字母缩略词将一个字符串分成几个字符串,我可以这样做:

myString.scan(/[A-Z][a-z]+/)

但它仅适用于大写字母,例如:

QuickFoxReadingPDF

LazyDogASAPSleep

结果中缺少全大写的首字母缩略词。

我应该将 RegEx 更改为什么,或者有其他替代方法吗?

谢谢!

更新:

后来我发现我的一些数据有数字,比如“RabbitHole3”,如果解决方案可以考虑数字那就太好了,即。 ["Rabbit", "Hole3"].

【问题讨论】:

  • 那不应该是/[A-Z][a-z]*/吗? [a-z]+ 表示至少一个小写字母PDF 明显缺失。您要将PDF 作为单个令牌还是将PDF 作为单独的令牌?
  • 谢谢@user4642212 我想要PDF 作为一个单一的令牌。

标签: regex ruby string split acronym


【解决方案1】:

使用

s.split(/(?<=\p{Ll})(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}\p{Ll})/)

proof

说明

--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    \p{Ll}                 any lowercase letter
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    \p{Lu}                 any uppercase letter
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
 |                        OR
--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    \p{Lu}                 any uppercase letter
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    \p{Lu}\p{Ll}           any uppercase letter, any lowercase letter
--------------------------------------------------------------------------------
  )                        end of look-ahead

Ruby code:

str = 'QuickFoxReadingPDF'
p str.split(/(?<=\p{Ll})(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}\p{Ll})/)

结果:["Quick", "Fox", "Reading", "PDF"]

【讨论】:

  • 谢谢,这比之前选择的答案更好,它还考虑了数字,例如RabbitHole3 变成“Rabbit Hole3”,而之前勾选的答案去掉了数字。
  • @hzxu 哦,但你从来没有提到数字。您的尝试是/[A-Z][a-z]+/,它也永远不会匹配数字。在这里,一个不那么模糊的问题描述会有所帮助。
  • @hzxu 很高兴它成功了,我认为,点赞对未来的访问者也有帮助。
  • 抱歉@user4642212 我没有意识到我的数据集包含带有数字的字符串,只是在测试此解决方案时发现并发现它也考虑了这些数字。
【解决方案2】:

模式[A-Z][a-z]+ 匹配单个大写字符 A-Z 和一个或多个小写字符 a-z,不考虑多个大写字符。

在这种情况下,您还希望匹配一个不直接跟在小写字符 a-z 之后的大写字符。

不确定首字母缩略词是否可以由单个大写字符组成,但是否应该至少有 2 个大写字符

[A-Z][a-z]+|[A-Z]{2,}(?![a-z])

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2012-11-11
    • 2011-09-15
    相关资源
    最近更新 更多