Необходимо отрицать этот шаблон регулярных выражений, но не знаю, как - PullRequest
0 голосов
/ 01 июля 2010

Я нашел шаблон регулярного выражения для PHP, который делает точную противоположность того, что мне нужно, и мне интересно, как я могу изменить это?

Допустим, у меня есть следующий текст: Item_154 ($12)

Этот шаблон /\((.*?)\)/ получает то, что находится в скобках, но мне нужно получить "Item_154" и вырезать то, что в скобках и пробел перед скобками.может сделать это?

Regex над моей головой, видимо ...

Ответы [ 7 ]

4 голосов
/ 01 июля 2010
/^([^( ]*)/

Совпадение всего от начала строки до первого пробела или (.

Если элемент, которому нужно соответствовать, может содержать пробелы, и вы только хотите избавиться от пробелов непосредственно перед скобками, тогда вы можете использовать это вместо:

/^([^(]*?)\s*\(/
2 голосов
/ 01 июля 2010

Следующее будет соответствовать всему, что выглядит как text (...), но возвращает только часть text в совпадении.

\w+(?=\s*\([^)]*\))

Объяснение:
\w включает в себя буквенно-цифровые символы и подчеркивание, где + говорит, что соответствует одному или нескольким.
Группа (?= ) положительно смотрит в будущее, говоря: «Подтвердите, что существует, но нене соответствует ему ".
Тогда у нас есть \s для пробела и *, говоря ноль или больше.
\( и \) соответствуют буквальным ( и ) символам (так как егообычно это специальный чат).
Символ [^)] не является чем-либо), и снова * равен нулю или более.

Надеюсь, все имеет смысл?

1 голос
/ 01 июля 2010

Один сайт, который мне действительно помог, был http://gskinner.com/RegExr/

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

1 голос
/ 01 июля 2010

/(.*)\(.*\)/

То, что не входит в (), теперь будет вашим первым матчем:)

0 голосов
/ 01 июля 2010

Вот один шаг, чтобы сделать все это

$text = 'Item_154 ($12)';
$text = preg_replace('/([^\s]*)\s(\()[^)]*(\))/', $1$2$3, $text);
var_dump($text);
//Outputs: Item_154()

Имейте в виду, что использование любых функций PCRE требует значительных затрат, поэтому если вы используете что-то подобное в длинном циклеи текст простой, вы, вероятно, могли бы сделать что-то подобное с substr / strpos и затем конкатенировать концы до конца, так как вы знаете, что они все равно должны быть пустыми.

Тем не менее, если вы ищетеИзучите REGEX и будьте с ними продуктивными, я бы посоветовал проверить: http://rexv.org Я нашел инструмент PCRE там очень полезным, хотя он может быть странным в некоторых отношениях.В частности, любые примеры, с которыми вы работаете, должны использовать только одинарные кавычки, если это возможно, так как они не работают правильно с двойными кавычками.

Кроме того, чтобы действительно понять, как использовать регулярные выражения, я хотел быПроверьте освоение регулярных выражений Джеффри Фридлом ISBN-13: 978-0596528126 Поскольку вы используете PHP, я постараюсь получить 3-е издание, поскольку в нем есть раздел, посвященный PHP PCRE.Обязательно прочитайте первые 6 глав, так как они дают вам основу, необходимую для работы с материалом в этой конкретной главе.Если вы видите 2-е издание где-нибудь по дешевке, то это почти такой же основной материал, так что это будет хорошая покупка.

0 голосов
/ 01 июля 2010

Следующее регулярное выражение работает для вашей строки в качестве замены, если это поможет? : -

\ s * \ (. *? \)

Вот объяснение того, что он делает ...

Пробел, любое количество повторений - \ s *

Литерал - \ (

Любой символ, любое количество повторений, как можно меньше -. *?

Буквально - \)

Я нашел Expresso (http://www.ultrapico.com/) - лучший способ изучения / разработки регулярных выражений.

НТН

0 голосов
/ 01 июля 2010
<?php
$string  = 'Item_154 ($12)';
$pattern = '/(.*)\(.*?\)/';

preg_match($pattern, $string, $matches);

var_dump($matches[1]);
?>

Должен ли ты получить Item_154

...