开发者

Need to negate this regex pattern, but no clue how

I found a regex pattern for PHP that does the exact OPPOSITE of what I'm needing, and I'm wondering how I can reverse it?

Let's say I have the following text: Item_154 ($12)

This pattern /\((.*?)\)/ gets what's inside the parenthesis, but I need to get "Item_154" and cut out what's in parenthesis and the space before the parenthesis.

Anybody know how I开发者_如何转开发 can do that?

Regex is above my head apparently...


/^([^( ]*)/

Match everything from the start of the string until the first space or (.

If the item you need to match can have spaces in it, and you only want to get rid of whitespace immediately before the parenthetical, then you can use this instead:

/^([^(]*?)\s*\(/


The following will match anything that looks like text (...) but returns just the text part in the match.

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


Explanation:
The \w includes alphanumeric and underscore, with + saying match one or more.
The (?= ) group is positive lookahead, saying "confirm this exists but don't match it".
Then we have \s for whitespace, and * saying zero or more.
The \( and \) matches literal ( and ) characters (since its normally a special chat).
The [^)] is anything non-) character, and again * is zero or more.

Hopefully all makes sense?


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

What is not in () will now be your 1st match :)


One site that really helped me was http://gskinner.com/RegExr/

It'll let you build a regex and then paste in some sample targets/text to test it against, highlighting matches. All of the possible regex components are listed on the right with (essentially) a tooltip describing the function.


<?php
$string  = 'Item_154 ($12)';
$pattern = '/(.*)\(.*?\)/';

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

var_dump($matches[1]);
?>

Should get you Item_154


The following regex works for your string as a replacement if that helps? :-

\s*\(.*?\)

Here's an explanation of what's it doing...

Whitespace, any number of repetitions - \s*

Literal - \(

Any character, any number of repetitions, as few as possible - .*?

Literal - \)

I've found Expresso (http://www.ultrapico.com/) is the best way of learning/working out regular expressions.

HTH


Here is a one-shot to do the whole thing

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

Keep in mind that using any PCRE functions involves a fair amount of overhead, so if you are using something like this in a long loop and the text is simple, you could probably do something like this with substr/strpos and then concat the parens on to the end since you know that they should be empty anyway.

That said, if you are looking to learn REGEXs and be productive with them, I would suggest checking out: http://rexv.org I've found the PCRE tool there to very useful, though it can be quirky in certain ways. In particular, any examples that you work with there should only use single quotes if possible, as it doesn't work with double quotes correctly.

Also, to really get a grip on how to use regexs, I would check out Mastering Regular Expressions by Jeffrey Friedl ISBN-13:978-0596528126 Since you are using PHP, I would try to get the 3rd Edition since it has a section specifically on PHP PCRE. Just make sure to read the first 6 chapters first since they give you the foundation needed to work with the material in that particular chapter. If you see the 2nd Edition on the cheap somewhere, that pretty much the same core material, so it would be a good buy as well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜