Реализации оператора AND регулярного выражения существуют. Язык TXR имеет (обозначен как &
), а также оператор отрицания, обозначенный ~
. Как вы можете видеть, это не относится к проблеме. Скорее всего, мы можем использовать его для сопоставления строк, которые не начинаются с пробела и, которые не заканчиваются с ]
:
$ txr
This is the TXR Lisp interactive listener of TXR 147.
Use the :quit command or type Ctrl-D on empty line to exit.
1> (defun complete-match (regex string)
(= (match-regex string regex) (length string)))
complete-match
2> (complete-match #/~ .*&~.*\]/ "")
t
3> (complete-match #/~ .*&~.*\]/ "a")
t
4> (complete-match #/~ .*&~.*\]/ "abc")
t
5> (complete-match #/~ .*&~.*\]/ " abc")
nil
6> (complete-match #/~ .*&~.*\]/ "abc]")
nil
7> (complete-match #/~ .*&~.*\]/ "]")
nil
8> (complete-match #/~ .*&~.*\]/ " ]")
nil
9> (complete-match #/~ .*&~.*\]/ " ")
nil
10> (complete-match #/~ .*&~.*\]/ "] ")
t
complete-match
функции мы кратко определить возвращает t
(истина) или nil
(ложь) если входная строка полностью соответствует регулярному выражению. (Автомат, обозначенный регулярным выражением, достигает состояния принятия при обработке всех символов строки.)
Регулярное выражение - ~ .*&~.*\]
. Оператор &
имеет низкое приоритетное значение, поэтому мы можем заключить в скобки его как (~ .*)&(~.*\])
: это соединение AND двух выражений. Оператор отрицания ~
имеет более низкий приоритет, чем catenation, поэтому ~abc
означает «подходит для чего угодно, кроме abc
»: это не означает [^a]bc
. Таким образом, ~ .*
обозначает набор строк, которые не начинаются с пробела, а ~.*\]
обозначает набор строк, которые не заканчиваются ]
. (Это должно быть экранировано в этой реализации регулярного выражения, поскольку это синтаксический символ регулярного выражения).
Эти отрицательные наборы включают пустые строки. Пустая строка соответствует ~ .*
, потому что пустая строка не начинается с пробела.
Чтобы решить проблему обрезки необязательного пространства или задней ]
, мы можем просто выполнить два последовательных регулярных выражений замены: удалить ведущее место, если таковые имеются, а затем удалить завершающую «]», если таковые имеются. Логика «и» преобразуется в последовательные этапы трансформации: сделайте это, чтобы ввести A, чтобы произвести B, а затем сделайте это для B, чтобы получить результат C.
Регулярные выражения для задачи не требуются, потому что вы можете просто проверить, является ли главный символ строки пространством, и условно на нее берутся либо остальная часть строки, либо целая строка. Аналогичным образом, обработайте хвост:
1> (defun trim-leading-char (str ch)
(if (equal [str 0..1] `@ch`)
[str 1..:]
str))
trim-leading-char
2> (defun trim-trailing-char (str ch)
(if (equal [str -1..:] `@ch`)
[str 0..-1]
str))
trim-trailing-char
3> (trim-leading-char " abc]" #\space)
"abc]"
4> (trim-trailing-char " abc]" #\])
" abc"
5> (trim-trailing-char (trim-leading-char " abc]" #\space) #\])
"abc"
Действительно, нет оператора _and_. Достаточно поставить оба параметра в регулярное выражение. – sln
Для этого вам не нужен оператор AND. Вам нужны все символы после ведущего пространства и перед хвостом ']'. Это достаточно легко написать RE для. Что-то вроде '' ^. * \] $ "', Ошибки и пропуски исключены. И вам не нужно 'Replace()', вам нужен любой API соответствия на любом языке и API, который вы используете. – EJP
Я пытался это сделать, но '' ^. * \] $ "' Невозможно – MinhKiyo