Возвращает только часть совпадения регулярных выражений
Привет,
Я думал, что 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*)