User 13204940 Ответов: 4

Возвращает только часть совпадения регулярных выражений


Привет,

Я думал, что x (? & lt;return> String) x должен был соответствовать "xStringx" и возвращать "String", но он возвращает все целиком.

Мой шаблон
((.* |(?<!.))(?<return>String)|(?<=.)<(?<return2>String)>)( .*|(?!.))


Если я запускаю это на "String goaway String", совпадение возвращает всю вещь, а не два захвата"String".

Что я уже пробовал:

-------------------------------------

Maciej Los

Так... В чем вопрос?

[no name]

Мацей, я знал, что ты спросишь. Я думал, это будет очевидно. Поскольку я удивлен, что получаю всю строку, а не только "строку", и я опубликовал вопрос об этом, здравый смысл подсказал бы вам, что мне нужна помощь, чтобы понять, почему это происходит и как это решить.

Maciej Los

ОК. Кажется, вы хотите вернуть точное совпадение. Можете ли вы предоставить образец ввода и ожидаемый результат? Используйте виджет" улучшить вопрос " (правый нижний угол вашего вопроса).

Richard MacCutchan

Возможно, регулярное выражение не является оптимальным инструментом для того, что вы пытаетесь сделать.

PIEBALDconsult

Если бы только было что-то вроде... https://www.codeproject.com/Articles/39165/RegexTester

[no name]

Я провел весь день с 7 утра до 1 часа ночи, работая над этим. Не будь таким снисходительным.

PIEBALDconsult

(? & lt;return> String).*? (? & lt;return2> String)?

[no name]

Это позволяет StringX

PIEBALDconsult

Разве не так?
Может быть, тебе лучше объяснить, чего ты хочешь.

[no name]

Мое регулярное выражение находится в вопросе.

Это позволяет:

* Пробел или ничего, затем "строка", затем пробел или ничего
• "Строка", то пробел или ничего
• Что-то потом & lt;строка> потом пробел или ничего

Matt T Heffron

Разве это не сделать это более просто? "?(?&ЛТ;возвращение>строка) ?|.*&л;(?&ЛТ;return2>строка)&ГТ; ?" (Ваш второй случай является подмножеством первого.) Почему вы возвращаете совпадающую "строку"? Раз ты знаешь, что в нем, зачем возвращать?

[no name]

А как еще я узнаю, есть ли совпадение?

Matt T Heffron

Это то, что я подозревал,но не хотел предполагать. Почему бы просто не использовать 2 разных регулярных выражения и не посмотреть, какие из них совпадают.Выполняется() ??

Matt T Heffron

Паттерн, который я показал выше, даст 3 совпадения для: "String goaway String foo & lt;string>". Первые два будут совпадать как "return" , а третий-как "return2". Если вы хотите проверить только один "необязательный" символ перед строкой <, то измените ". * "на".?"

PIEBALDconsult

Может быть, вам просто нужно больше скобок.
(?<=\s*) ((? 'match1' String)|(? 'match2'<string & gt;)) (?=\s*)

4 Ответов

Рейтинг:
28

User 13204940

Решение, написанное по адресу Необычная проблема подсветки синтаксиса[^]


Рейтинг:
2

Matt T Heffron

Несколько вещей:
Последняя группа захвата в конце паттерна:
 ( .*|(?!.))
что довольно странно:
захватить любой:
  пробел, за которым следует 0 или более любой символ
или
  Если суффикс (любой отдельный символ) будет отсутствовать.

Вся остальная часть паттерна - это одна группа захвата, поэтому все, что соответствует ее частям, также захватывается в этой группе как целое.

То Match возвращенный Regex.Match() всегда будет отчитываться как свой Value вся часть входных данных, которая привела к успешному совпадению. Это то же самое, что match.Groups(0) Другой нумерованные группы захвата начните с .Groups(1).

Шаблон и пример строки, которые вы дали, возвращаются:

match.Groups.Count = 6
match.Groups(0) = "String goaway String"
match.Groups(1) = "String goaway String"
match.Groups(2) = "String goaway "
match.Groups(3) = ""
match.Groups(4) = "String"
match.Groups(5) = ""
match.Groups("return") = "String"
match.Groups("return2") = ""
Я предлагаю использовать Экспрессо[^] который является отличным бесплатным инструментом для построения и тестирования регулярных выражений.


Рейтинг:
1

Maciej Los

Если я вас хорошо понимаю, вы хотите получить точное совпадение. Итак, проверьте IndexOf метод:
Строка.Метод IndexOf (String) (System)[^]
Как выполнить поиск в строке (Visual Basic) | Microsoft Docs[^]

Для получения более подробной информации, пожалуйста, смотрите:
Как культура влияет на строки в Visual Basic | Microsoft Docs[^]
Исполнительской Культуры К Регистру Сравнения Строк | Майкрософт Документы[^]
<PAVE OVER & gt; сравнение и сортировка данных для конкретной культуры[^]

[РЕДАКТИРОВАТЬ]

Пример:

Dim sSearchedString As String = "WhateverXstringYboolXstringZ is lorem ipsum string bool string"
Dim sKeys As String() = New String(){"bool", "string"}
Dim sb As StringBuilder = New StringBuilder()
Dim counter As Integer = 0, i As Integer = 0

For counter = sKeys.GetLowerBound(0) To sKeys.GetUpperBound(0)
	i = sSearchedString.IndexOf(sKeys(counter), 0)
	Do While i>-1
		sb.Append(String.Format("'{0}' has been found at position: {1}{2}" ,sKeys(counter), i, Microsoft.VisualBasic.vbCrLf)) 
		i = sSearchedString.IndexOf(sKeys(counter), i+1)
	Loop
Next
Console.WriteLine("{0}", sb.ToString())


Возвращается:
'bool' has been found at position: 16
'bool' has been found at position: 51
'string' has been found at position: 9
'string' has been found at position: 21
'string' has been found at position: 44
'string' has been found at position: 56


[no name]

Строка.IndexOf не будет работать, потому что может быть что-то вроде

"int String String"

Таким образом, 2-я строка будет проигнорирована, а IndexOf("boolean") приведет к -1.

Maciej Los

Это неправда. IndexOf метод имеет множество реализаций и может быть использован внутри цикла. Вы можете использовать IndexOf(string, int32) метод, где второй параметр используется для определения начальной позиции поиска в строке. Проверьте обновленное решение.

[no name]

Я сумел решить все проблемы сразу и опубликовал решение по другому моему вопросу, https://www.codeproject.com/Questions/1191744/Unusual-syntax-highlighting-issue

Рейтинг:
1

Patrice T

((.* |(?<!.))(?<return>String)|(?<=.)<(?<return2>String)>)( .*|(?!.))

Мне любопытно узнать в простом тексте, что вы пытаетесь сопоставить.
Используйте последнюю ссылку, чтобы увидеть красивую диаграмму вашего регулярного выражения. Это может помочь понять, что происходит.

Цитата:
Всего несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
Это показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]