自定义解析字符串
Custom parsing string
在解析 FTX(自由文本)字符串时,我需要使用 +
作为分隔符来拆分它,但前提是它前面没有转义字符(例如,?
)。
所以这个字符串 nika ?+ marry = love+sandra ?+ alex = love
应该被解析为两个字符串:nika + marry = love
和 sandra + alex = love
。
使用 String.Split('+')
显然是不够的。我能以某种方式实现它吗?
在我看来,一种方法是用一些独特的字符(或一系列字符)替换出现的 ?+
,例如 @#@
,使用“+”作为分隔符分隔符,然后将 @#@
替换回 +
,但我能想到的任何可能方式都是不可靠和错误的。
?
仅与 :
或 +
结合使用作为转义字符,在任何其他情况下它被视为常规字符。
一个可怕的正则表达式来拆分它:
string str = "nika ?+ marry = love??+sandra ???+ alex = love";
string[] splitted = Regex.Split(str, @"(?<=(?:^|[^?])(?:\?\?)*)\+");
它在字符串开头 (^
) 或非 ?
字符 ([^?]
) 前面的 + (\+
) 上拆分加上偶数个 ?
((?:\?\?)*
)。可以自由使用 (?:)
(非捕获组),因为如果有多个捕获组,Regex.Split
会做一些有趣的事情。
注意我不是在做unescape!所以最后?+
还是?+
.
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string s = "nika ?+ marry = love+sandra ?+ alex = love";
string[] result = Regex.Split(s, "\?{0}\+", RegexOptions.Multiline);
s = String.Join("\n", result);
Regex rgx = new Regex("\?\n");
s = rgx.Replace(s, "+");
result = Regex.Split(s, "\n", RegexOptions.Multiline);
foreach (string match in result)
{
Console.WriteLine("'{0}'", match);
}
}
}
产出
'nika + marry = love'
'sandra + alex = love'
在解析 FTX(自由文本)字符串时,我需要使用 +
作为分隔符来拆分它,但前提是它前面没有转义字符(例如,?
)。
所以这个字符串 nika ?+ marry = love+sandra ?+ alex = love
应该被解析为两个字符串:nika + marry = love
和 sandra + alex = love
。
使用 String.Split('+')
显然是不够的。我能以某种方式实现它吗?
在我看来,一种方法是用一些独特的字符(或一系列字符)替换出现的 ?+
,例如 @#@
,使用“+”作为分隔符分隔符,然后将 @#@
替换回 +
,但我能想到的任何可能方式都是不可靠和错误的。
?
仅与 :
或 +
结合使用作为转义字符,在任何其他情况下它被视为常规字符。
一个可怕的正则表达式来拆分它:
string str = "nika ?+ marry = love??+sandra ???+ alex = love";
string[] splitted = Regex.Split(str, @"(?<=(?:^|[^?])(?:\?\?)*)\+");
它在字符串开头 (^
) 或非 ?
字符 ([^?]
) 前面的 + (\+
) 上拆分加上偶数个 ?
((?:\?\?)*
)。可以自由使用 (?:)
(非捕获组),因为如果有多个捕获组,Regex.Split
会做一些有趣的事情。
注意我不是在做unescape!所以最后?+
还是?+
.
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string s = "nika ?+ marry = love+sandra ?+ alex = love";
string[] result = Regex.Split(s, "\?{0}\+", RegexOptions.Multiline);
s = String.Join("\n", result);
Regex rgx = new Regex("\?\n");
s = rgx.Replace(s, "+");
result = Regex.Split(s, "\n", RegexOptions.Multiline);
foreach (string match in result)
{
Console.WriteLine("'{0}'", match);
}
}
}
产出
'nika + marry = love'
'sandra + alex = love'