使用正则表达式匹配具有任意分隔符的字段

时间:2015-05-20 04:41:27

标签: c# regex

我认为这应该是一个老问题,然而,经过几个小时的搜索,我在论坛中找不到合适的解决方案。

我正在使用C#,我知道可以使用Regex.SplitString.Split方法来实现预期的结果。出于某种原因,我需要使用正则表达式来匹配必需的字段,方法是指定任意分隔符。例如,这是字符串:

#DIV#This#DIV#is#DIV#"A  "#DIV#string#DIV#

在这里,#DIV#是分隔符,将被拆分为:

This
is
"A  "
string

如何使用正则表达式匹配这些值?

顺便说一下,前导和尾随#DIV#也可以忽略,例如,下面的源字符串也应该与上面的结果相同:

#DIV#This#DIV#is#DIV#"A  "#DIV#string

This#DIV#is#DIV#"A  "#DIV#string#DIV#

This#DIV#is#DIV#"A  "#DIV#string

3 个答案:

答案 0 :(得分:1)

<强>更新

我认为我找到了一种方法(介意它效率不高!)用正则表达式去除空值。

var splits = Regex.Matches(strIn, @"(?<=#DIV#|^)(?:(?!#DIV#).)+?(?=$|#DIV#)");

请参阅demo on regexstorm(请注意\r?仅在多线模式下进行演示,在现实生活中使用时不需要它)

原始回答

以下是使用常规Split的另一种方法:

var strIn = "#DIV#This#DIV#is#DIV#\"A # \"#DIV#string#DIV#";
var splitText = strIn.Split(new[] {"#DIV#"}, StringSplitOptions.RemoveEmptyEntries);

否则,您可以使用正则表达式匹配您需要的字段,然后使用LINQ删除空项:

var spltsTxt2 = Regex.Matches(strIn, @"(?<=#DIV#|^).*?(?=#DIV#|$)").Cast<Match>().Where(p => !string.IsNullOrEmpty(p.Value)).Select(p => p.Value).ToList();

输出:

enter image description here enter image description here

答案 1 :(得分:0)

您可以使用以下内容进行匹配:

/#?DIV#?/g

并替换为' '(空格)

但是这有时会给出尾随和前导空格..可以使用String.Trim()

删除

编辑1:如果您想匹配字段值,可以使用以下内容:

(?<=(#?DIV#?)|^)[^#]*?(?=(#?DIV#?)|$)

请参阅DEMO

Edit2:在字段中匹配#的更通用的正则表达式:

(?m)(?<=(^(?!#?DIV#)|(#?DIV#)))(.*?)(?=($|(#DIV#?)))

答案 2 :(得分:0)

$('#area').keyup(function(){
    $('.word-counter').text($.trim(this.value.length)+'/100');
})

试试这个。抓住捕获或组。参见演示。

https://www.regex101.com/r/fJ6cR4/21