464
votes

I am looking for a pattern that matches everything until the first occurrence of a specific character, say a ";" - a semicolon.

I wrote this:

/^(.*);/

But it actually matches everything (including the semicolon) until the last occurrence of a semicolon.

12
/^(.*?);/ should also work (it's called non-greedy), but the given answers using [^;]* are better.Pascal
how would you select everything, after semicolon, and not semicolon itself.Muhammad Umer
see this works \w+(?!([^]+;)|;) but this doesn't why? .+(?!([^]+;)|;)Muhammad Umer
Pascal, you should have written that as an answer!Sean Kendle

12 Answers

619
votes

You need

/[^;]*/

The [^;] is a character class, it matches everything but a semicolon.

To cite the perlre manpage:

You can specify a character class, by enclosing a list of characters in [] , which will match any character from the list. If the first character after the "[" is "^", the class matches any character not in the list.

This should work in most regex dialects.

355
votes

Would;

/^(.*?);/

work?

The ? is a lazy operator, so the regex grabs as little as possible before matching the ;.

40
votes

/^[^;]*/

The [^;] says match anything except a semicolon. The square brackets are a set matching operator, it's essentially, match any character in this set of characters, the ^ at the start makes it an inverse match, so match anything not in this set.

16
votes

Try /[^;]*/

Google regex character classes for details.

10
votes

Try /[^;]*/

That's a negating character class.

10
votes

sample text:

"this is a test sentence; to prove this regex; that is g;iven below"

If for example we have the sample text above, the regex /(.*?\;)/ will give you everything until the first occurence of semicolon (;), including the semicolon: "this is a test sentence;"

7
votes

This was very helpful for me as I was trying to figure out how to match all the characters in an xml tag including attributes. I was running into the "matches everything to the end" problem with:

/<simpleChoice.*>/

but was able to resolve the issue with:

/<simpleChoice[^>]*>/

after reading this post. Thanks all.

6
votes

None of the proposed answers did work for me. (e.g. in notepad++) But

^.*?(?=\;)

did.

5
votes

this is not a regex solution, but something simple enough for your problem description. Just split your string and get the first item from your array.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

output

$ php test.php
match everything until first
5
votes

This will match up to the first occurrence only in each string and will ignore subsequent occurrences.

/^([^;]*);*/
3
votes

"/^([^\/]*)\/$/" worked for me, to get only top "folders" from an array like:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this
2
votes

Really kinda sad that no one has given you the correct answer....

In regex, ? makes it non greedy. By default regex will match as much as it can (greedy)

Simply add a ? and it will be non-greedy and match as little as possible!

Good luck, hope that helps.