Посмотрите, содержит ли строка элемент в массиве
Я пытаюсь просмотреть массив операторов, чтобы увидеть, находится ли один из операторов в строке.
Например:
String[] OPERATORS = { "<", "<=", ... };
String line = "a <= b < c ";
Как мне пройти цикл, который проверяет, находится ли оператор в строке?
Также, скажем, мой метод обнаружил, что "<" находится в строке в " <="
Тем не менее, я ищу фактическую строку " <= ". Как мне вести учет этого?
4 ответа
Я бы использовал регулярное выражение вместо массива всех операторов. Кроме того, убедитесь, что операторы находятся в точном порядке в вашем регулярном выражении, т.е. <=
должно быть раньше <
, так же, ==
должно быть раньше =
:
String regex = "<=|<|>=|>|==|=|\\+|-";
String line = "a <= b < c ";
Matcher matcher = Pattern.compile(regex).matcher(line);
while (matcher.find()) {
System.out.println(matcher.start() + " : " + matcher.group());
}
Выход:
2 : <=
7 : <
Хитрость в том, что до совпадения с регулярным выражением <
из <=
, это уже будет соответствовать <=
как и прежде <
,
Нечто подобное должно учитывать>= соответствие>.
String[] OPERATORS = {"<=>", "<=", ">=", ">", "=" ..} //The key here is that if op1 contains op2, then it should have a lower index than it
String copy = new String(line);
for(String op : OPERATORS)
{
if(copy.contains(op))
{
copy = copy.replaceAll(op, "X"); //so that we don't match the same later
System.out.println("found " + op);
}
}
Если вам также нужен индекс, тогда вам нужно заменить OP на число X одинаковой длины. Если у вас может быть кратно каждой операции, и вам нужна позиция всех из них, то это еще работа. Но вопрос не слишком конкретен в этом вопросе. В любом случае, это должно помочь вам.
Это будет работать, только если у оператора есть место с обеих сторон:
for (String operator : OPERATORS) {
Matcher m = Pattern.compile("\\s\\" + operator + "\\s").matcher(line);
while (m.find())
System.out.println((m.start() + 1) + " : " + m.group());
}
и это работает без какого-либо специального заказа операторов.
Вот что я бы сделал:
for(String operator : OPERATORS)
{
if(Pattern.compile("[\\s\\w]" + operator + "[\\s\\w]").matcher(line).find())
{
System.out.println(operator + " found in " + line);
}
}
Он должен работать правильно с точки зрения не найти <
оператор в <=
,
Полный код:
import java.util.regex.Pattern;
public class Test
{
public static void main(String[] args)
{
String[] OPERATORS = { "<", "<="};
String line = "a <= b < c ";
for(String operator : OPERATORS)
{
if(Pattern.compile("[\\s\\w]" + operator + "[\\s\\w]").matcher(line).find())
{
System.out.println(operator + " found in " + line);
}
}
}
}