Как найти символ между буквенными и числовыми символами, используя RegEx - PullRequest
1 голос
/ 02 октября 2019

Я работаю в Access VBA и пытаюсь заменить любые тире, которые появляются между буквенным и цифровым символом (или наоборот). Я пытаюсь сделать это с помощью регулярного выражения, чтобы найти тире (и только тире), если он появляется между буквой и цифрой или цифрой и буквой.

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

/([0-9]-[A-Za-z])|([A-Z-a-z]-[0-9])/g

Actual Results:
1234-56789         nothing is matched
12-A458-125        2-A is matched
1-A-2-B-C985-ABC   1-A, A-2, 2-B,5-A are matched

В этих ситуациях я хочу определить только символ -

Возможно ли это?

Спасибо!

1 Ответ

1 голос
/ 02 октября 2019

В общем, шаблон для определения дефисов между буквами и цифрами, действительный для механизмов регулярных выражений, поддерживающих как lookbehinds, так и lookaheads, имеет вид

(?<=\d)-(?=[A-Za-z])|(?<=[A-Za-z])-(?=\d)

(?<=\d) - это положительный lookbehind, который соответствует местоположению, непосредственно предшествующемус цифрой (?<=[A-Za-z]) - это вид сзади, который соответствует местоположению, которому предшествует буква, (?=[A-Za-z]) положительный взгляд требует, чтобы буква появлялась сразу после текущей позиции, а (?=\d) требует цифры.

Чтобы удалить все дефисы между буквами и цифрами в коде VBA, используйте

(\d)-(?=[A-Za-z])|([A-Za-z])-(?=\d)

Замените на $1$2 в качестве строки замены.

См. Демонстрационный пример regex

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

Вам по-прежнему нужны заголовки для включения перекрытиясовпадения и, к счастью, регулярное выражение VBA на основе поддержки более старой версии скрипта ECMAts lookaheads.

Пример кода :

Dim objRegExp As Object
Set objRegExp = CreateObject("vbscript.regexp")

objRegExp.Global = True
objRegExp.Pattern = "(\d)-(?=[A-Za-z])|([A-Za-z])-(?=\d)"
text = objRegExp.Replace(text, "$1$2")
...