User 13204940 Ответов: 5

Быстрый вопрос о регулярном выражении


Привет,

В настоящее время мой шаблон регулярного выражения - " привет"

Как я могу разрешить либо "привет", либо "привет", т. е. после слова должно быть либо ничего, либо символ непосредственно после него может быть только пробелом.

Спасибо,

Рикс

РЕДАКТИРОВАТЬ:

Теперь у меня есть
(([."])|([ ]))hello\2|\(hello\)


который соответствует:
.привет.
"привет"
(привет)
но не х привет

Как я могу позволить что-то раньше?

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

Глядя на регулярное выражение и не понимая паттернов

5 Ответов

Рейтинг:
2

Peter Leow

Попробовать это:

hello\s?
\с на один пробел
? повторите ноль или один раз


Рейтинг:
2

OriginalGriff

Тро добавит к предложению Пита Леоу: "привет" не совпадает просто с "привет" и "привет?" это не просто совпадение hello с пробелом после него. Он также соответствует

"hello there"
"hello-there"
"why-hello!"
И все остальное, что содержит буквы "привет"в этой последовательности.
Если вы хотите точно соответствовать "привет" или " Привет ", то вы хотите:
^hello\s?$

Если вы хотите работать с регулярными выражениями, то получите копию Экспрессо[^]- это бесплатно, и он проверяет, тестирует и генерирует регулярные выражения. Чертовски полезно, и я жалею, что не написал его!


User 13204940

Это не тот шаблон, на котором я хочу остановиться, но у меня есть код:

Частная суб updateCodeSyntaxHighlighting()
Dim ключевые слова как новое регулярное выражение ("\bhello\b|\bthere\b")

Dim selPos As Integer = codeEditorBox.Объект selectionstart
Dim selPos2 As Integer = codeEditorBox.GetFirstCharIndexOfCurrentLine

Если не codeEditorBox.Text = "" Тогда
codeEditorBox.Выберите (0, codeEditorBox.Линий(codeEditorBox.GetLineFromCharIndex(селпос)).Длина)

codeEditorBox.Объект selectionstart = selPos2
codeEditorBox.SelectionColor = codeEditorBox.Цвет

codeEditorBox.Объект selectionstart = селпос
Конец, Если

Для каждого ключевого слова соответствует как совпадение в ключевых словах.Играм(codeEditorBox.Текст)
codeEditorBox.Выберите (keywordMatch.Индекс, совпадение ключевых слов.Длина)
codeEditorBox.SelectionColor = Цвет.FromArgb(64, 255, 64)
codeEditorBox.Объект selectionstart = селпос
codeEditorBox.SelectionColor = codeEditorBox.Цвет
Следующий

codeEditorBox.SelectionLength = 0
Конец Подводной Лодки

который вызывается в событии TextChanged.

Если я наберу "xhello", а затем поставлю пробел после" x", совпадение не будет найдено. Я не могу понять, что я делаю не так

OriginalGriff

Быстрый тест с "x hello", и он отлично подходит.
Я бы изменил регулярное выражение, чтобы сделать его более читабельным:

\b (привет / там)\b

но и то и другое приведет к одинаковым результатам.
Что происходит при отладке кода? Что это показывает, что происходит?

User 13204940

"x hello" работает нормально, но проблема в том, что я набираю "xhello" и потом ставлю пробел. Это не делает "привет" зеленым.

OriginalGriff

Это, вероятно, потому, что вы не вызываете метод! Что показывает отладчик?

User 13204940

Ошибок не бывает. Этот метод вызывается в событии textchanged. Когда я вхожу в это пространство, он должен запустить метод, увидеть, что есть "x hello", а затем соответствовать "hello". Дело в том, что это не так.

Он работает с "x hello", но не с "xhello", а затем помещает пробел внутрь

OriginalGriff

А что показывает отладчик?
Вы поставили точку останова в верхней части метода и прошли через нее, чтобы точно выяснить, что происходит, или вы предполагаете, что "нет ошибок" в компиляции означает, что отладчик ничего не покажет?

User 13204940

Хорошо, я решил эту проблему, нужно:
codeEditorBox.Объект selectionstart = keywordMatch.Индекс + совпадение ключевых слов.Длина
вместо
codeEditorBox.Объект selectionstart = селпос

Поскольку предполагалось, что каретка находится в конце строки, она не выбирала правильный диапазон, когда это было не так

Рейтинг:
2

CPallini

Так и должно быть "hello\s?", см., например VB.Net -Регулярные Выражения[^].


User 13204940

Это позволяет "hellox"

Рейтинг:
0

Richard MacCutchan

Идти к RegExr: Learn, Build, & amp; Test RegEx[^].


User 13204940

Теперь у меня есть
(((?=.+?)((["])|([ .]))|\3)привет\4 / \(Привет\))|\1(?=([. ]+?))

Как я мог сделать так, чтобы он не позволял ничего или только ("." или " ") после?

Richard MacCutchan

hello[\.\s]

Рейтинг:
0

Patrice T

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


User 13204940

Используя Debuggex я придумал:
(((?=.+?)((["])|([ .]))|\3)привет\4 / \(Привет\))(?!(.+?))|\1(?=([. ]+?))

Однако это все еще не идеально, но уже на пути туда.

Что должно быть разрешено:

привет
космос тогда привет
тогда здравствуй космос
затем пространство привет, то пространство
(привет)
"привет"
.привет
привет.
что угодно тогда привет
привет тогда что угодно

Нет:

привет
xhello
xhellox