我有一个带有特定模式的多行字符串(即'##'),可能出现在行的开头或结尾。然而,这种模式有时会丢失,我想有效地检测它的存在位置和缺失位置。
我通过手工分析每一行编写了一个解决方案,但我想正则表达式可以提供更有效和稳定的解决方案。我们的想法是将该行分为三组,一组用于初始分隔符,一组用于数据,一组用于最终分隔符。因此,拥有空组将意味着丢失分隔符或丢失数据。以下是我的意思的一些例子:
abcd --> ("", "abcd", "")
##abcd --> ("##", "abcd", "")
abcd## --> ("", "abcd", "##")
##abcd## --> ("##", "abcd", "##")
##ab#cd## --> ("##", "ab#cd", "##")
#### --> ("##", "", "##")
我试过这个正则表达式:
(##)?(.*)(\1)?
但是中心组(。*)合并到尾随分隔符
使用这个:
(##)?([^#]*)(\1)?
更好,但上面的最后两个例子都失败了。任何提示?
答案 0 :(得分:2)
默认情况下,正则表达式是贪婪的。这意味着应用于(##)?(.*)(##)?
的{{1}}将##abcd##
带到第二组,而第3组将为空(空字符串匹配abcd##
)。
这就是为什么你应该为第二组使用非贪婪的guantifier (##)?
。
适用于所有情况的正则表达式是:
(.*?)
答案 1 :(得分:1)
您可以添加^
和$
来指示字符串的开头和结尾。
这个怎么样:
^(##)?(.*?)(\1)?$
或(如果字符串包含尾随换行符):
^(##)?(.*?)(\1)?\s*$
我不知道正则表达式的含义以及您使用的编程语言。在Python中,您还需要启用MULTILINE
模式。在JavaScript中,您还需要启用m
flag。其他语言可能具有类似的机制来指定多行模式。
答案 2 :(得分:0)
使用正则表达式和捕获组进行字符串拆分将为您提供所需的信息。这会拆分字符串,并在结果中返回分隔符。如果" ##"根本不显示,这意味着它不存在。
var strs = ["abcd", //--> ("", "abcd", "")
"##abcd", //--> ("##", "abcd", "")
"abcd##", //--> ("", "abcd", "##")
"##abcd##", //--> ("##", "abcd", "##")
"##ab#cd##", //--> ("##", "ab#cd", "##")
"####"] //--> ("##", "", "##")
function splitStr(str){
return str.split(/(##)/g)
}
strs.forEach(str => console.log(splitStr(str)))