Как найти конкретного персонажа в Java - PullRequest
1 голос
/ 06 января 2012

У меня есть строка типа a>5 and b<6 or c>=7 в Java

Когда я проверяю, содержит ли строка >, вывод будет истинным для > и >=

Как я могу ограничить свой чек только конкретным персонажем?

Как использовать функцию matches?

Ответы [ 5 ]

2 голосов
/ 06 января 2012

Вы хотите различать больше и больше или равно . Почему бы не написать метод, который возвращает оператор?

enum Operator { 
...
}

public Operator getOperator(String s) { 

    if(s.contains(">=")) { 
       return Operator.GREATER_THAN_OR_EQUAL_TO;
    } else if (s.contains(">") {
       return Operator.GREATER_THAN;
    }

}

Если входное значение может быть сложным выражением, которое содержит несколько операторов, вместо contains, попробуйте использовать indexOf(...) и посмотрите вперед на один символ для '='.

2 голосов
/ 06 января 2012

Ваша ошибка в том, что вы думаете о лексической сущности >= как о «персонаже». Это будет кусать вас не раз, так как на самом деле есть два символа, > и =, и > действительно здесь. Поэтому в зависимости от того, что вам нужно, ответ может быть разным.

Почему ты не хочешь увидеть >= найден?

Какое использование > вас интересует? Будет например <tag>some text</tag> быть правильной строкой, которую вы бы предпочли разрешить?

1 голос
/ 07 января 2012

Я просто скинул это вместе на основе обновленных спецификаций. По сути, это действительно простой парсер, довольно механически созданный: (И я не очень хорош в названии в 7 утра, да ладно)

public class Main {

    public static void main(String[] args) {
        String test = "a > b >= c > x";
        Main m = new Main(test);
        System.out.println(m.getTokenNumber());

        test = "aasdfasdf asdfdasf";
        m = new Main(test);
        System.out.println(m.getTokenNumber());
    }

    private String input;
    private int pos;

    public Main(String input) {
        this.input = input;
        pos = 0;
    }

    public TokenNumber getTokenNumber() {
        TokenNumber tokenNumber = new TokenNumber();
        Token t = nextToken();
        while (t != Token.NONE) {
            tokenNumber.addToken(t);
            t = nextToken();
        }
        return tokenNumber;
    }

    private Token nextToken() {
        while (pos < input.length() && input.charAt(pos) != '>') pos++;
        if (pos == input.length()) return Token.NONE;
        pos++;
        if (pos == input.length() || input.charAt(pos) != '=') return Token.GREATER;
        return Token.GREATER_EQUAL;
    }

    enum Token {
        GREATER, GREATER_EQUAL, NONE;
    }

    static class TokenNumber {
        public int greater;
        public int greater_than;

        public void addToken(Token t) {
            if (t == Token.GREATER) greater++;
            else greater_than++;
            assert t != Token.NONE;
        }

        public String toString() {
            return String.format("Greater: %d%nGreater Than: %d", greater, greater_than);
        }
    }

}
0 голосов
/ 06 января 2012
"your string >".contains(">");// returns true
0 голосов
/ 06 января 2012

boolean value = Pattern.compile(">").matcher("a>5").find(); // returns true

...