2016-08-30 3 views
0

У меня есть 2 строки, как показано ниже:Регулярное выражение AND operator?

string str = " 2016/07/19 19:47:46]"; 
string str1 = " Origin (2)]"; 

Я хочу, чтобы получить результат не начинаться с пробела и не заканчивается с отметкой]

"2016/07/19 19:47:46"; 
"Origin (2)"; 

Я использовал шаблон строки шаблон = @»^[^ \ S] ", но оператор И я не знаю.

string result = Regex.Replace(str, @"^[^\S]", ""); 

Любая помощь будет принята с благодарностью.

+1

Действительно, нет оператора _and_. Достаточно поставить оба параметра в регулярное выражение. – sln

+1

Для этого вам не нужен оператор AND. Вам нужны все символы после ведущего пространства и перед хвостом ']'. Это достаточно легко написать RE для. Что-то вроде '' ^. * \] $ "', Ошибки и пропуски исключены. И вам не нужно 'Replace()', вам нужен любой API соответствия на любом языке и API, который вы используете. – EJP

+0

Я пытался это сделать, но '' ^. * \] $ "' Невозможно – MinhKiyo

ответ

1

Не пространство в BOL ИЛИ не марки на EOL:

(?m)^(?:\S.*|.*[^\]])$

Я думаю И версия:

(?m)^\S.*[^\]]$

Другой И версия, которая будет разрешить 0 или более символов:

(?m)^(?!\s).*(?<!\])$

+0

спасибо, я подтвержу – MinhKiyo

1

Реализации оператора 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" 
+0

Спасибо за подробное объяснение, я многое узнал. – MinhKiyo

Смежные вопросы