简体   繁体   中英

Regex: matching up to the first occurrence of a character

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.

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.

Would;

/^(.*?);/

work?

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

/^[^;]*/

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.

Try /[^;]*/

Google regex character classes for details.

Try /[^;]*/

That's a negating character class .

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;"

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

^.*?(?=\;)

did.

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.

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

这将仅匹配每个字符串中的第一次出现,并将忽略后续出现。

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

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

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

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.

This works for getting the content from the beginning of a line till the first word,

/^.*?([^\s]+)/gm

I faced a similar problem including all the characters until the first comma after the word entity_id . The solution that worked was this in Bigquery:

SELECT regexp_extract(line_items,r'entity_id*[^,]*') 

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM