Regex:只匹配单个字符(字符串中不包含字符)
本文关键字:字符 字符串 包含 Regex 单个 | 更新日期: 2023-09-27 17:53:03
目的:根据单个字符的模式拆分字符串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
(它们也可能改变)。
你可以在那里放一些's
来确保你匹配的字符是单独的:
(?<='s)(?=[@'+''>X]'s)
(?<='s)
确保字符前面有空格,后面的空格确保字符后面有空格。
注意:上面提到的'space'实际上是指空白,制表符,换行符,回车符
把你的正则表达式分成两个,然后用管道连接:
(?=[@'+''>])|(?='bX'b)
(?=[@'+''>])
检查你的常规字符。
(?='bX'b)
正在单独检查X
为什么不使用自己的正则表达式呢?
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() ;
}