正则表达式:仅匹配单个字符(字符串中不包含任何字符)

时间:2014-03-25 17:34:22

标签: c# regex

目标:根据单个字符的模式拆分字符串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的建议似乎对我来说最可行。我上班的时候会测试。

3 个答案:

答案 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() ;

}