自定义解析字符串

Custom parsing string

在解析 FTX(自由文本)字符串时,我需要使用 + 作为分隔符来拆分它,但前提是它前面没有转义字符(例如,?)。 所以这个字符串 nika ?+ marry = love+sandra ?+ alex = love 应该被解析为两个字符串:nika + marry = lovesandra + alex = love。 使用 String.Split('+') 显然是不够的。我能以某种方式实现它吗?

在我看来,一种方法是用一些独特的字符(或一系列字符)替换出现的 ?+,例如 @#@,使用“+”作为分隔符分隔符,然后将 @#@ 替换回 +,但我能想到的任何可能方式都是不可靠和错误的。

? 仅与 :+ 结合使用作为转义字符,在任何其他情况下它被视为常规字符。

一个可怕的正则表达式来拆分它:

string str = "nika ?+ marry = love??+sandra ???+ alex = love";
string[] splitted = Regex.Split(str, @"(?<=(?:^|[^?])(?:\?\?)*)\+");

它在字符串开头 (^) 或非 ? 字符 ([^?]) 前面的 + (\+) 上拆分加上偶数个 ? ((?:\?\?)*)。可以自由使用 (?:)(非捕获组),因为如果有多个捕获组,Regex.Split 会做一些有趣的事情。

注意我不是在做unescape!所以最后?+还是?+.

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string s = "nika ?+ marry = love+sandra ?+ alex = love";
        string[] result = Regex.Split(s, "\?{0}\+", RegexOptions.Multiline);                  
        s = String.Join("\n", result);      
        Regex rgx = new Regex("\?\n");
        s = rgx.Replace(s, "+");
        result = Regex.Split(s, "\n", RegexOptions.Multiline);                         
        foreach (string match in result)
        {
             Console.WriteLine("'{0}'", match);
        }   
    }
}

产出

'nika + marry = love'
'sandra + alex = love'

https://dotnetfiddle.net/HkcQUw