如何使用正则表达式来检测字符串中缺少的分隔符?

时间:2018-04-04 18:27:01

标签: regex

我有一个带有特定模式的多行字符串(即'##'),可能出现在行的开头或结尾。然而,这种模式有时会丢失,我想有效地检测它的存在位置和缺失位置。

我通过手工分析每一行编写了一个解决方案,但我想正则表达式可以提供更有效和稳定的解决方案。我们的想法是将该行分为三组,一组用于初始分隔符,一组用于数据,一组用于最终分隔符。因此,拥有空组将意味着丢失分隔符或丢失数据。以下是我的意思的一些例子:

abcd         --> ("", "abcd", "")
##abcd       --> ("##", "abcd", "")
abcd##       --> ("", "abcd", "##")
##abcd##     --> ("##", "abcd", "##")
##ab#cd##    --> ("##", "ab#cd", "##")
####         --> ("##",  "", "##")

我试过这个正则表达式:

(##)?(.*)(\1)?

但是中心组(。*)合并到尾随分隔符

使用这个:

(##)?([^#]*)(\1)?

更好,但上面的最后两个例子都失败了。任何提示?

3 个答案:

答案 0 :(得分:2)

默认情况下,正则表达式是贪婪的。这意味着应用于(##)?(.*)(##)?的{​​{1}}将##abcd##带到第二组,而第3组将为空(空字符串匹配abcd##)。

这就是为什么你应该为第二组使用非贪婪的guantifier (##)?

适用于所有情况的正则表达式是:

(.*?)

Regex Fiddle

答案 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)))