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(它们也可能改变)。

基于这个理由,Jonny/Jerry的建议对我来说似乎是最可行的。等我开始工作的时候再测试。

Regex:只匹配单个字符(字符串中不包含字符)

你可以在那里放一些'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() ;
}