How to make a regular expression match based on a

2020-05-07 20:16发布

I'm trying to make a conditional regex, I know that there are other posts on stack overflow but there too specific to the problem.


The Question

How can I create a regular expression that only looks to match something given a certain condition?


An example

An example of this would be if we had a list of a string(this is in java):

String nums = "42 36 23827";

and we only want to match if there are the same amount of x's at the end of the string as there are at the beginning

What we want in this example

In this example, we would want a regex that checks if there are the same amount of regex's at the end as there are in the beginning. The conditional part: If there are x's at the beginning, then check if there are that many at the end, if there are then it is a match.


Another example

An example of this would be if we had a list of numbers (this is in java) in string format:

String nums = "42 36 23827";

and we want to separate each number into a list

String splitSpace = "Regex goes here";
Pattern splitSpaceRegex = Pattern.compile(splitSpace);
Matcher splitSpaceMatcher = splitSpaceRegex.matcher(text);
ArrayList<String> splitEquation = new ArrayList<String>();

while (splitSpaceMatcher.find()) {
    if (splitSpaceMatcher.group().length() != 0) {
        System.out.println(splitSpaceMatcher.group().trim());
        splitEquation.add(splitSpaceMatcher.group().trim());
    }
}

How can I make this into an array that looks like this:

["42", "36", "23827"]

You could try making a simple regex like this:

String splitSpace = "\\d+\\s+";

But that exludes the "23827" because there is no space after it. and we only want to match if there are the same amount ofx`'s at the end of the string as there are at the beginning

What we want in this example

In this example, we would want a regex that checks if it is the end of the string; if it is then we don't need the space, otherwise, we do. As @YCF_L mentioned we could just make a regex that is \\b\\d\\b but I am aiming for something conditional.


Conclusion

So, as a result, the question is, how do we make conditional regular expressions? Thanks for reading and cheers!

标签: java regex
3条回答
▲ chillily
2楼-- · 2020-05-07 21:05

I would like to use split which accept regex like so :

String[] split = nums.split("\\s+"); // ["42", "36", "23827"]

If you want to use Pattern with Matcher, then you can use String \b\d+\b with word boundaries.

String regex = "\\b\\d+\\b";

By using word boundaries, you will avoid cases where the number is part of the word, for example "123 a4 5678 9b" you will get just ["123", "4578"]

查看更多
Root(大扎)
3楼-- · 2020-05-07 21:09

I do not see the "conditional" in the question. The problem is solvable with a straight forward regular expression: \b\d+\b.

regex101 demo

A fully fledged Java example would look something like this:

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Ideone {
    public static void main(String args[]) {
        final String sample = "123 45 678 90";
        final Pattern pattern = Pattern.compile("\\b\\d+\\b");
        final Matcher matcher = pattern.matcher(sample);
        final ArrayList<String> results = new ArrayList<>();
        while (matcher.find()) {
            results.add(matcher.group());
        }
        System.out.println(results);
    }
}

Output: [123, 45, 678, 90]

Ideone demo

查看更多
成全新的幸福
4楼-- · 2020-05-07 21:13

There are no conditionals in Java regexes.

I want a regex that checks if there are the same amount of regex's at the end as there are in the beginning. The conditional part: If there are x's at the beginning, then check if there are that many at the end, if there are then it is a match.

This may or may not be solvable. If you want to know if a specific string (or pattern) repeats, that can be done using a back reference; e.g.

   ^(\d+).+\1$

will match a line consisting of an arbitrary number digits, any number of characters, and the same digits matched at the start. The back reference \1 matches the string matched by group 1.

However if you want the same number of digits at the end as at the start (and that number isn't a constant) then you cannot implement this using a single (Java) regex.

Note that some regex languages / engines do support conditionals; see the Wikipedia Comparison of regular-expression engines page.

查看更多
登录 后发表回答