Почему этот RegEx не работает с `git grep`? - PullRequest
1 голос
/ 17 февраля 2020

Входные данные - тексты Unicode.

входные данные

あいうえお

команда

Среда выполнения - macOS.

git grep '[い]' # -> matched
grep 'あ[い]う' # -> matched

git grep 'あ[い]う' # -> not matched

Почему нет RegEx работает в git grep, когда работает нормальный grep?

среда

ОС: macOS
Язык: ja_JP.UTF-8

Кодировка входного файла это UTF-8.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2020

Все мои эксперименты показывают, что git grep использует кодировку ASCII-8BIT:

git grep 'あ[い][い][い]う'
# matches (because \xE3, \x81 and \x84 match [\xe3\x81\x84])
git grep 'あ[か]'
# matches (because \xE3, the first byte of い, matches [\xe3\x81\x8b])

Последний даже явно показывает совпадающие байты.

Поскольку класс символов ([...] ) является единственной конструкцией в RegExp, которая рассматривает отдельные символы, а не строки, и, поскольку все регулярные выражения класса символов можно легко переписать в регулярные регулярные выражения, вот обходной путь: если регулярное выражение было '上[げが]る', вы можете написать

git grep '上\(げ\|が\)る'  # (alternation instead of character class)
git grep -E '上(げ|が)る'  # (prettier with extended regexp syntax)
1 голос
/ 17 февраля 2020

Мне кажется, это нормально работает:

$ echo 'あいうえお' > afile
$ git add afile
$ grep 'あ[い]う' afile
あいうえお
$ git grep 'あ[い]う'
afile:あいうえお

Может быть, вы как-то настроили patternType по умолчанию?

grep.patternType

Установить поведение соответствия по умолчанию. Использование значения basi c, extended, fixed или perl включит параметр --basi c -regexp, --extended-regexp, --fixed-strings или - perl -regexp соответственно, в то время как значение default вернется к поведению сопоставления по умолчанию.

Попробуйте вызвать git grep -G для принудительного использования базовых c паттернов и посмотрите, что произойдет. Или git config --get grep.patternType, чтобы увидеть, было ли установлено какое-то нечетное значение.

Также имейте в виду, что git grep просматривает только "отслеживаемые файлы в рабочем дереве, BLOB-объекты, зарегистрированные в индексном файле, или BLOB-объекты в данные объекты дерева ". Поэтому, если вы добавляете строку в файл, но не добавляете файл в индекс, совпадения не будет.

Аналогично, если строка находится в старом коммите, что очень сильно отличается от hg grep (который просматривает историю по умолчанию)

...