извлечь последнее совпадение из строки в c # - PullRequest
1 голос
/ 25 июня 2010

у меня есть строки в форме [abc].[some other string].[can.also.contain.periods].[our match]

Теперь я хочу сопоставить строку «наше совпадение» (то есть без скобок), поэтому я поиграл с поиском обходов и так далее. Теперь я получил правильное совпадение, но не думаю, что это чистое решение.

(?<=\.?\[)     starts with '[' or '.['
([^\[]*)      our match, i couldn't find a way to not use a negated character group
              `.*?` non-greedy did not work as expected with lookarounds,
              it would still match from the first match
              (matches might contain escaped brackets)
(?=\]$)       string ends with an ]

язык - .net / c #. если есть более простое решение без использования регулярных выражений, я также был бы рад узнать

что меня действительно раздражает, так это то, что я не могу использовать (.*?) для захвата строки, так как кажется, что не жадный не работает со взглядами.

Я также пытался: Regex.Split(str, @"\]\.\[").Last().TrimEnd(']');, но я не очень-то и радуюсь этому решению

Ответы [ 4 ]

3 голосов
/ 25 июня 2010

Следующее должно сделать трюк.Предполагая, что строка заканчивается после последнего совпадения.

string input = "[abc].[some other string].[can.also.contain.periods].[our match]";

var search = new Regex("\\.\\[(.*?)\\]$", RegexOptions.RightToLeft);

string ourMatch = search.Match(input).Groups[1]);
2 голосов
/ 25 июня 2010

При условии, что вы можете гарантировать формат ввода, и это только последняя запись, которую вы хотите, LastIndexOf может быть использовано:

string input = "[abc].[some other string].[can.also.contain.periods].[our match]";

int lastBracket = input.LastIndexOf("[");
string result = input.Substring(lastBracket + 1, input.Length - lastBracket - 2);
0 голосов
/ 25 июня 2010

У вас есть несколько вариантов:

  • RegexOptions.RightToLeft - да, .NET regex может сделать это!Используйте это!
  • Сопоставьте все это с жадным префиксом, используйте скобки, чтобы захватить интересующий вас суффикс
    • Таким образом, обычно pattern становится .*(pattern)
    • В этом случае .*\[([^\]]*)\], затем извлеките то, что захватывает \1 ( см. Это на rubular.com )

Ссылки

0 голосов
/ 25 июня 2010

С String.Split ():

string input = "[abc].[some other string].[can.also.contain.periods].[our match]";
char[] seps = {'[',']','\\'};
string[] splitted = input.Split(seps,StringSplitOptions.RemoveEmptyEntries);

вы получаете "out match" в splitted [7], а can.also.contain.periods остается одной строкой (splitted [4])

Редактировать: массив будет иметь строку внутри [], а затем. и так далее, поэтому, если у вас есть переменное число групп, вы можете использовать это, чтобы получить желаемое значение (или удалить строки, которые просто '.')

Отредактировано для добавления обратной косой черты в разделитель для обработки таких случаев, как '\ [abc \]'

Edit2: для вложенных []:

string input = @"[abc].[some other string].[can.also.contain.periods].[our [the] match]";
string[] seps2 = { "].["};
string[] splitted = input.Split(seps2, StringSplitOptions.RemoveEmptyEntries);

Вы наш [the] совпадение] в последнем элементе (индекс 3), и вам придется удалить лишний]

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