如何将长正则表达式(RegEx)拆分为多行?
嘿,这个需求太常见了!把超长的正则拆成多行不仅能提升可读性,后续维护起来也方便太多。结合你用的Kotlin三重引号语法,有两种靠谱的方法:
方法1:字符串拼接拆分
直接把每个语言分支拆成单独的字符串片段,用+连接起来。这种方法完全保留原有正则的匹配逻辑,不需要调整模式:
val regEx = """(?i)""" + """(where|were|\bw)\s*(are|r)\s*(you|u)""" + """|(Dónde estás)""" + """|(Donde estas)""" + """|(Ku jeni ju)""" + """|(Non zaude)""" + """|(Дзе вы знаходзіцеся)""" + """|(Gdje si ti)""" + """|(Къде си)""" + """|(On ets)""" + // 注意:原正则这里有个空格,确认是否是必要的匹配项 """|(Gdje si)""" + """|(Kde jsi)""" + """|(Hvor er du)""" + """|(Waar ben je)""" + """|(Kus sa oled)""" + """|(Missä sinä olet)""" + """|(Où es tu)""" + """|(Onde estás)""" + """|(Wo bist du)""" + """|(Που είσαι)""" + """|(Merre jársz)""" + """|(Hvar ertu)""" + """|(Hvor er du)""" + """|(Gdzie jesteś)""" + """|(Onde está você)""" + """|(Unde esti)""" + """|(Где ты)""" + """|(Где си)""" + """|(Kde si)""" + """|(Kje si)""" + """|(Var är du)""" + """|(Де ти)""" + """|(Ble ydych chi)""" + """|(ווו זענען איר)""" + """|(Որտեղ...)"""
方法2:使用正则扩展模式(推荐)
利用正则的(?x)扩展模式(忽略空白和注释),配合Kotlin的trimMargin()去掉每行的缩进,这样不仅能换行,还能给每个分支加注释说明对应的语言,可读性拉满:
val regEx = """(?ix) # 英语变体 (where|were|\bw)\s*(are|r)\s*(you|u) # 西班牙语(带/不带重音) |(Dónde estás) |(Donde estas) # 阿尔巴尼亚语 |(Ku jeni ju) # 巴斯克语 |(Non zaude) # 白俄罗斯语 |(Дзе вы знаходзіцеся) # 克罗地亚语 |(Gdje si ti) # 保加利亚语(西里尔字母) |(Къде си) # 加泰罗尼亚语 |(On ets) # 波斯尼亚/克罗地亚/塞尔维亚语 |(Gdje si) # 捷克语 |(Kde jsi) # 丹麦语/挪威语 |(Hvor er du) # 荷兰语 |(Waar ben je) # 爱沙尼亚语 |(Kus sa oled) # 芬兰语 |(Missä sinä olet) # 法语 |(Où es tu) # 欧洲葡萄牙语 |(Onde estás) # 德语 |(Wo bist du) # 希腊语 |(Που είσαι) # 匈牙利语 |(Merre jársz) # 冰岛语 |(Hvar ertu) # 波兰语 |(Gdzie jesteś) # 巴西葡萄牙语 |(Onde está você) # 罗马尼亚语 |(Unde esti) # 俄语 |(Где ты) # 塞尔维亚语(西里尔字母) |(Где си) # 斯洛伐克语 |(Kde si) # 斯洛文尼亚语 |(Kje si) # 瑞典语 |(Var är du) # 乌克兰语 |(Де ти) # 威尔士语 |(Ble ydych chi) # 意第绪语 |(ווו זענען איר) # 亚美尼亚语(片段) |(Որտեղ...) """.trimMargin()
小提醒:
(?ix)里的i是你原来的忽略大小写模式,x是新增的扩展模式,两者可以合并写。- 原正则里有些分支后面带了空格(比如
(On ets)),要确认这些空格是否是必须匹配的内容,如果是手误的话记得去掉,避免匹配错误。 trimMargin()会去掉每行开头的空白(默认是|,这里没用到所以直接去掉缩进),确保正则里的换行和缩进不会干扰匹配逻辑。
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

