Как разделить строку с более длинными разделителями, которые предпочтительнее более коротких? - PullRequest
1 голос
/ 10 июня 2019

У меня есть string, который я хочу разделить на две части. Обычно это имя, оператор и значение. Я хотел бы разделить его на имя и значение. Имя может быть любым, значение тоже. У меня есть массив операторов, и я хочу использовать его в качестве разделителей:

var input = "name>=2";
var separators = new string[]
{
    ">",
    ">=",
};
var result = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);

Код выше дает результат name и =2. Но если я переставлю порядок разделителей, то >= будет первым, вот так:

var separators = new string[]
{
    ">=",
    ">",
};

Таким образом, я получаю хорошие name и 2, чего я и пытаюсь достичь. К сожалению, держать сепараторы в идеальном порядке мне некуда. Кроме того, моя коллекция разделителей не является неизменной. Итак, я думаю, может быть, я мог бы разделить string с более длинными разделителями, имеющими приоритет над более короткими?

Спасибо за помощь!

Здесь является связанным вопросом, объясняющим, почему такое поведение происходит в методе Split().

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Вы можете попробовать несколько вариантов.Если у вас есть совокупность разделителей, вы можете отсортировать их в правильном порядке перед разделением:

  using System.Linq;

  ...

  var result = input.Split(
    separators.OrderByDescending(item => item.Length), // longest first
    StringSplitOptions.RemoveEmptyEntries);

Вы можете попробовать организовать все (включая возможные) разделители в один pattern , например,

 [><=]+

здесь мы разделены на самую длинную последовательность >, < и =

 var result = Regex.Split(input, "[><=]+");

Демо:

  using System.Text.RegularExpressions;

  ...

  string[] tests = new string[] {
    "name>123",
    "name<4",
    "name=78",
    "name==other",
    "name===other",
    "name<>78",
    "name<<=4",
    "name=>name + 455",
    "name>=456",
    "a_b_c=d_e_f",
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => string.Join("; ", Regex.Split(test, "[><=]+"))));

  Console.Write(report);

Итог:

name; 123
name; 4
name; 78
name; other
name; other
name; 78
name; 4
name; name + 455
name; 456
a_b_c; d_e_f
2 голосов
/ 10 июня 2019

Вы можете попытаться выполнить регулярное выражение для чередования, которое перечисляет более длинное >= first:

var input = "name>=2";
string[] parts = Regex.Split(input, "(?:>=|>)");
foreach(var item in res)
{
    Console.WriteLine(item.ToString());
}

Это печатает:

name
2

Примечание, на которое мы разбили (?:>|>=), результат был бы name и =2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...