简体   繁体   中英

Regex for matching strings between '=' and '/' or "=" and end of string

I am looking for regex which can help me replace strings like

source=abc/task=cde/env=it --> source='abc'/task='cde'/env='it'

To be more precise, I want to replace a string which starts with = and ends with either / or end of the string with ''

Tried code like this

"source=abc/task=cde/env=it".replaceAll("=(.*?)/","'$1'")

But that results in

source'abc'task'cde'env=it

Using lookahead and look behind:

(?<==)([^/]*)((?=/)|$)

Lookbehind allows you to specify what comes before your match. In this case an equals: (?<==) .

The main match in my regex looks for any non-slash character, zero or more times: ([^/]*)

Lookahead allows you to specify what comes after your match. In this case, a slash: (?=/) .

The $ matches the end of the line, so that the last item in your test data becomes quoted. ((?=/)|$) combines with this with the lookahead, meaning "either a slash comes after the match or this is the end of the line".

Here it is in action in a test.

@Test 
public void test_quote_items() {
    String regex = "(?<==)([^/]*)((?=/)|$)";
    String actual = "source=abc/task=cde/env=it".replaceAll(regex,"'$1'");
    String expected = "source='abc'/task='cde'/env='it'";
    assertEquals(expected, actual);
}

Try

String input = "source=abc/task=cde/env=it".replaceAll("=(.*?)(/|$)","='$1'/");

The problems I found are that you are not replacing the = and also the / is not there for the end of String, that also needs to be replaced when found.

output

source='abc'/task='cde'/env='it'/

If you don't want the last '/', that is trivial to remove isn't it.

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