目标:根据单个字符的模式拆分字符串Regex.Split(...)
,使字符在拆分列表的开头匹配。
问题:其中一个字符可以出现在我不希望拆分的字符串的其他部分中,并且我得到的列表项比预期更多。
要拆分的字符串示例:T 2 TBS PO And > Qd PRN MIX X A 3 TB \ A 4 TB Xmon UG
期望的结果:
T 2 TBS PO And
> Qd PRN MIX
X A 3 TB
\ A 4 TB Xmon UG
模式:(?=[@\+X\\>])
这适用于X
以外的所有内容。而不是期望的结果,我将它分散在不受欢迎的地方。
目前的结果:
T 2 TBS PO And
> Qd PRN MI
X
X A 3 TB
\ A 4 TB X
mon UG
基本上,我需要它不分裂在一串字符上,只有在它自己的时候。
提前感谢您的帮助
更新:哎呀!我似乎忘了提到模式的中心,要分割的字符,已经从表中拉出来,技术上,我不知道事先有X
(它们也可能会改变。 )
出于这个原因,Jonny 5 / Jerry的建议似乎对我来说最可行。我上班的时候会测试。
答案 0 :(得分:2)
您可以在其中放置一些\s
以确保您匹配的字符是独立的:
(?<=\s)(?=[@\+\\>X]\s)
(?<=\s)
确保字符前面有空格,后面的空格确保字符后跟空格。
注意:上面提到'space',它实际上意味着空格,制表符,换行符,回车符。
答案 1 :(得分:0)
将你的正则表达式分成两部分并用管道传输:
(?=[@\+\\>])|(?=\bX\b)
(?=[@\+\\>])
检查您的常规字符。
(?=\bX\b)
正在检查X
答案 2 :(得分:0)
为什么不滚动自己而不是使用正则表达式:
public IEnumerable<string> CustomSplit( string source )
{
StringBuilder buf = new StringBuilder();
for ( int i = 0 ; i < source.Length ; ++i )
{
char curr = source[i] ;
char next = i+1 < source.Length ? source[i+1] : ' ' ;
bool isDelimiter = curr == '@'
| curr == '+'
| curr == '\\'
| curr == '>'
| ( curr == 'X' && char.IsWhiteSpace(next) )
;
if ( isDelimiter )
{
if ( buf.Length > 0 ) yield return buf.ToString() ;
buf.Length = 0 ;
}
buf.Append(curr) ;
}
// return the last element, if there is one.
if ( buf.Length > 0 ) yield return buf.ToString() ;
}