C# - 复杂的正则表达式

时间:2017-04-27 11:47:03

标签: c# regex string

所以我有一个很大的问题......

我得到一个字符串:

function myCallBackCustomFunction(callback) 
       {
           //DO YOUR STUFF FOR api then call your server to store data    

          yourCustomsaveFunction(callback);
       }
function yourCustomsaveFunction(googlevars)
{
 $.ajax("your url?myparameters="+googlevars, {
  success: function(data) {
    //your data save msg if any
  },
  error: function() {
     //your error msg if any
  }

我需要把它分成

  • ' X,Y'

  • 2

  • 4

  • ' Y,Z'

我没有尝试过任何接近预期结果的地方......

提前致谢!

3 个答案:

答案 0 :(得分:2)

如果您正在寻找快速解决方案,请尝试此操作(简单的循环而不是正则表达式):

private static IEnumerable<string> CsvSplitter(string source) {
  if (string.IsNullOrEmpty(source))
    yield break; //TODO: you may want to throw exception in case source == null

  int lastIndex = 0;
  bool inQuot = false;

  for (int i = 0; i < source.Length; ++i) {
    char c = source[i];

    if (inQuot) 
      inQuot = c != '\'';
    else if (c == '\'')
      inQuot = true;
    else if (c == ',') {
      yield return source.Substring(lastIndex, i - lastIndex);

      lastIndex = i + 1;
    }
  }

  //TODO: you can well have invalid csv (unterminated quotation):
  // if (inQuot)
  //   throw new FormatException("Incorrect CSV");

  yield return source.Substring(lastIndex);
}

样品:

string source = @"'x,y',2,4,'y,z',";
string[] result = CsvSplitter(source).ToArray();

Console.Write(string.Join(Environment.NewLine, result));

输出:

'x,y'
2
4
'y,z'

然而,在一般情况下 google for CSV解析器

答案 1 :(得分:2)

如果你想采用正则表达式,你可以使用

('.*?'|[^,]+)

并浏览捕获组,但我强烈建议您使用CSV解析器。

答案 2 :(得分:1)

如果没有允许嵌套引号,我们可以使用简单的正则表达式'.*?'|[^,]+检索所需的部分:

var input = "'x,y',2,4,'y,z'";

var parts = Regex
  .Matches(input, "'.*?'|[^,]+")
  .Cast<Match>()
  .Select(m => m.Value)
  .ToList();

Console.WriteLine(string.Join(Environment.NewLine, parts));

演示:https://dotnetfiddle.net/qo5aHz

虽然.NET flavor允许为嵌套引号详细说明,但它会相当困难,因此最好使用现成的CSV解析器。例如,TextFieldParser随.NET提供。