如何用正则表达式分割以下字符串?

时间:2020-11-30 09:03:18
规则:如果元素中有.则把此元素用""包住,如果有双引号则用2个双引号代替,并最后用""包围元素。
如s.s则为"s.s","s则为"""s","s"则为"""s""",a."s则为"a.""s"

以下为3行(用;分行)共6给元素按以上规则组成的字符串,请对它进行分割(求正则表达式)。
a.b;"c1.c2".d;"d0""d1""".e;

如先按;区分成3行,再按.把每行分成2列(假设每列内容不含有;号)。也就是一个s[3][2]的数组。

分割后:
s[0][0]=a;s[0][1]=b
s[1][0]=c1.c2;s[0][1]=d
s[2][0]=d0"d1";s[2][1]=e

8 个解决方案

#1


你究竟要替换还是要分割


string test = "a.b;\"c1.c2\".d;\"d0\"\"d1\"\"\".e;";
Regex reg = new Regex(@"([^;]+);");
string result = reg.Replace(test, delegate(Match m) {return "\"" + m.Groups[1].Value.Replace("\"", "\"\"") + "\";"; });
richTextBox2.Text = result;
/*------输出------
"a.b";"""c1.c2"".d";"""d0""""d1"""""".e";
*/

#2


提问也是一门艺术

#3


string s= "\"s";
s = "\""+Regex.Replace(s,"\"|[^\"]",m=>m.Value=="\""?"\"\"":m.Value)+"\"";

#4


要分割,但我不知道分割的规则,我只知道分割前元素组合成字符串的原规则,现在是要按原组合规则反向分割。

#5


可能表达不清,要么我换一种说法吧,就是将
a.b."c1.c2"."d""d0""d"
分割成
a
b
c1.c2
d"d0"d

按.分割,但.也有可能是元素的一部分

#6


foreach(Match m in Regex.Matches(s,@"(([^"]|"[^"]*")+?)(\.|$)"))
{
    TextBox1.AppendText(m.Groups[1].Value+Environment.NewLine);
}

#7


foreach(Match m in Regex.Matches(s,@"(([^""]|""[^""]*"")+?)(\.|$)"))
{
    TextBox1.AppendText(m.Groups[1].Value+Environment.NewLine);
}

#8


引用 5 楼 anderax 的回复:
可能表达不清,要么我换一种说法吧,就是将
a.b."c1.c2"."d""d0""d"
分割成
a
b
c1.c2
d"d0"d

按.分割,但.也有可能是元素的一部分


string test = "a.b.\"c1.c2\".\"d\"\"d0\"\"d\"";
Regex reg = new Regex("(?n)\"(?<o>(\"\"|[^\"])*)\"|(?<o>[^.\"]+)");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
    richTextBox2.Text += m.Groups["o"].Value + "\n";
}
/*-----输出------
a
b
c1.c2
d""d0""d
*/


最后一种情况,不能直接得到d"d0"d,需要进行源字符串的预处理,或者结果的二次处理,把""替换为"

#1


你究竟要替换还是要分割


string test = "a.b;\"c1.c2\".d;\"d0\"\"d1\"\"\".e;";
Regex reg = new Regex(@"([^;]+);");
string result = reg.Replace(test, delegate(Match m) {return "\"" + m.Groups[1].Value.Replace("\"", "\"\"") + "\";"; });
richTextBox2.Text = result;
/*------输出------
"a.b";"""c1.c2"".d";"""d0""""d1"""""".e";
*/

#2


提问也是一门艺术

#3


string s= "\"s";
s = "\""+Regex.Replace(s,"\"|[^\"]",m=>m.Value=="\""?"\"\"":m.Value)+"\"";

#4


要分割,但我不知道分割的规则,我只知道分割前元素组合成字符串的原规则,现在是要按原组合规则反向分割。

#5


可能表达不清,要么我换一种说法吧,就是将
a.b."c1.c2"."d""d0""d"
分割成
a
b
c1.c2
d"d0"d

按.分割,但.也有可能是元素的一部分

#6


foreach(Match m in Regex.Matches(s,@"(([^"]|"[^"]*")+?)(\.|$)"))
{
    TextBox1.AppendText(m.Groups[1].Value+Environment.NewLine);
}

#7


foreach(Match m in Regex.Matches(s,@"(([^""]|""[^""]*"")+?)(\.|$)"))
{
    TextBox1.AppendText(m.Groups[1].Value+Environment.NewLine);
}

#8


引用 5 楼 anderax 的回复:
可能表达不清,要么我换一种说法吧,就是将
a.b."c1.c2"."d""d0""d"
分割成
a
b
c1.c2
d"d0"d

按.分割,但.也有可能是元素的一部分


string test = "a.b.\"c1.c2\".\"d\"\"d0\"\"d\"";
Regex reg = new Regex("(?n)\"(?<o>(\"\"|[^\"])*)\"|(?<o>[^.\"]+)");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
    richTextBox2.Text += m.Groups["o"].Value + "\n";
}
/*-----输出------
a
b
c1.c2
d""d0""d
*/


最后一种情况,不能直接得到d"d0"d,需要进行源字符串的预处理,或者结果的二次处理,把""替换为"