Измените поиск регулярных выражений, чтобы добавить захваты меньших строк [duplicate]

public class Employee {

    private int empId;
    private String empName;

    public Employee(int empId, String empName) {
        super();
        this.empId = empId;
        this.empName = empName;
    }

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    @Override
    public String toString() {
        return "Employee [empId=" + empId + ", empName=" + empName + "]";
    }

    @Override
    public int hashCode() {
        return empId + empName.hashCode();
    }

    @Override
    public boolean equals(Object obj) {

        if (this == obj) {
            return true;
        }
        if (!(this instanceof Employee)) {
            return false;
        }
        Employee emp = (Employee) obj;
        return this.getEmpId() == emp.getEmpId() && this.getEmpName().equals(emp.getEmpName());
    }

}

Класс теста

public class Test {

    public static void main(String[] args) {
        Employee emp1 = new Employee(101,"Manash");
        Employee emp2 = new Employee(101,"Manash");
        Employee emp3 = new Employee(103,"Ranjan");
        System.out.println(emp1.hashCode());
        System.out.println(emp2.hashCode());
        System.out.println(emp1.equals(emp2));
        System.out.println(emp1.equals(emp3));
    }

}

В объекте Class equals (Object obj) используется для сравнения сравнения адресов, поэтому, когда в классе Test, если вы сравниваете два объекта, тогда equals метод дает false, но когда мы переопределяем hashcode (), он может сравнивать контент и давать правильный результат.

60
задан Sebastian Zartner 9 June 2015 в 11:15
поделиться

1 ответ

Использование функции String match() не возвратит захваченные группы, если установлен глобальный модификатор, как вы выяснили.

В этом случае вы хотели бы использовать RegExp и вызвать функцию exec(). String 's match() почти идентичен функции RegExp exec() ... кроме случаев, подобных этим. Если глобальный модификатор установлен, нормальная функция match() не вернет захваченные группы, тогда как функция RegExp exec() будет. (Замечание здесь , среди других мест.)

Еще один улов, который следует помнить, заключается в том, что exec() не возвращает совпадений в одном большом массиве - он продолжает возвращать совпадения до тех пор, пока он не будет запущен , и в этом случае он возвращает null.

Итак, например, вы можете сделать что-то вроде этого:

var pattern = /t(e)(s)t/g;  // Alternatively, "new RegExp('t(e)(s)t', 'g');"
var match;    

while (match = pattern.exec(text)) {
    // Do something with the match (["test", "e", "s"]) here...
}

Еще одно замечание: RegExp.prototype.exec() и RegExp.prototype.test() выполнить регулярное выражение в предоставленной строке и вернуть первый результат. Каждый последовательный вызов будет проходить через обновление набора результатов RegExp.prototype.lastIndex на основе текущей позиции в строке.

Вот пример: // помните, что в примере и шаблоне есть 4 совпадения. lastIndex начинается с 0

pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9
pattern.exec(text); // pattern.lastIndex = 14
pattern.exec(text); // pattern.lastIndex = 19

// if we were to call pattern.exec(text) again it would return null and reset the pattern.lastIndex to 0
while (var match = pattern.exec(text)) {
    // never gets run because we already traversed the string
    console.log(match);
}

pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9

// however we can reset the lastIndex and it will give us the ability to traverse the string from the start again or any specific position in the string
pattern.lastIndex = 0;

while (var match = pattern.exec(text)) {
    // outputs all matches
    console.log(match);
}

Вы можете найти информацию о том, как использовать RegExp объекты на MDN (в частности, здесь представлена ​​документация для exec() функция [/ д2]).

92
ответ дан idmean 25 August 2018 в 18:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: