【问题标题】:How to split this string by regex?如何通过正则表达式拆分此字符串?
【发布时间】:2023-03-18 18:48:01
【问题描述】:

我有一些字符串,它们看起来像:

div#title.title.top
#main.main
a.bold#empty.red

它们类似于haml,我想用正则表达式拆分它们,但我不知道如何定义它。

val r = """???""".r // HELP
val items = "a.bold#empty.red".split(r)
items // -> "a", ".bold", "#empty", ".red"

如何做到这一点?


更新

对不起,大家,但我需要让这个问题变得更难。我很感兴趣

val r = """(?<=\w)\b"""

但它无法解析更复杂的:

div#question-title.title-1.h-222_333

我希望它会被解析为:

div
#question-title
.title-1
.h-222_333 

我想知道如何改进该正则表达式?

【问题讨论】:

  • 好吧,您期望它会解析什么?你还没有真正解释你的期望是什么。

标签: regex scala split


【解决方案1】:
val r = """(?<=\w)\b(?!-)"""

请注意,split 接受代表正则表达式的String,而不是Regex,因此您不能将rString 转换为Regex

正则表达式的简要说明:

  • (?&lt;=...) 是一个后视。它声明此匹配必须以模式... 开头,或者在您的情况下为\w,这意味着您希望该模式跟随数字、字母或下划线。

  • \b 表示字边界。它是在单词字符(数字、字母和下划线)和非单词字符之间发生的零长度匹配,反之亦然。因为它是零长度,split 在拆分时不会删除任何字符。

  • (?!...) 是负前瞻。在这里,我曾经说过我对从字母到破折号的单词边界不感兴趣。

【讨论】:

    【解决方案2】:

    从 Josh M 的回答开始,他有一个很好的正则表达式,但由于split 采用匹配“分隔符”的正则表达式,因此您需要使用findAllIn,如下所示:

    val r = """(?:\.|#)?\w+""".r
    val items = r findAllIn "a.bold#empty.red"
        //maybe you want a toList on the end also
    

    然后你得到结果

    div#title.title.top    -> List(div, #title, .title, .top)
    #main.main             -> List(#main, .main)
    a.bold#empty.red       -> List(a, .bold, #empty, .red)
    

    【讨论】:

    • 是的,我不\不知道有问题的函数的细节。
    • 非常感谢。但是由于@Josh是第一个给我正确答案的人,所以我决定接受他的回答。
    • 请注意scala.util.matching.Regex 也有split 方法。
    【解决方案3】:

    我不完全确定您在这里需要什么,但这应该会有所帮助:

    (?:\.|#)?\w+
    

    这意味着“术语”被定义为可选的点或散列,后跟一些单词字符。

    你最终会得到:

    div
    #title
    .title
    .top
    #main
    .main
    a
    .bold
    #empty
    .red
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多