React Native: почему допустимый шаблон регулярных выражений Javascript не работает на Android?

#javascript #regex #react-native

#javascript #регулярное выражение #react-native

Вопрос:

Вот регулярное выражение:

 const pattern = /d s*.s*((. ?n) ?(?=[aA])))/;
const str = `8. X-XIII asrlarda barpo etilgan inshootlar to‘g‘ri berilgan qatorni aniqlang.
1) Ismoil Somoniy maqbarasi, 2) Masjidi Kalon,
3) Namozgoh, 4) Minorayi Kalon, 5) Vobkent minorasi, 6) Ahmad Yassaviy maqbarasi, 7) Jarqo‘rg‘on minorasi, 8) Kaltaminor.
A) 1, 2, 3, 6, 7
B) 1, 3, 4, 5, 7
C) 1, 2, 4, 6, 8
D) 2, 3, 4, 6, 7`

const m = pattern.exec(str);
console.log(m) // outputs null when run on Android
 

Вот то же самое, что работает на консоли браузера:

 const pattern = /d s*.s*((. ?n) ?(?=[aA])))/;
const str = `8. X-XIII asrlarda barpo etilgan inshootlar to‘g‘ri berilgan qatorni aniqlang.
1) Ismoil Somoniy maqbarasi, 2) Masjidi Kalon,
3) Namozgoh, 4) Minorayi Kalon, 5) Vobkent minorasi, 6) Ahmad Yassaviy maqbarasi, 7) Jarqo‘rg‘on minorasi, 8) Kaltaminor.
A) 1, 2, 3, 6, 7
B) 1, 3, 4, 5, 7
C) 1, 2, 4, 6, 8
D) 2, 3, 4, 6, 7`

const m = pattern.exec(str);
console.log(m) 

Я предполагаю, что react native не может скомпилировать мой шаблон javascript в машинный код.
Чего мне не хватает?

среда разработки

  • Android 10 Q API 29
  • Windows 10 Pro
  • управляемое expo приложение react-native
  • expo: 4.13.0
  • react-native: 0.64.3

Комментарии:

1. Что, если окончания строк отличаются? Попробуйте /d s*.s*((?:. (?:rn?|n))*?(?=[aA])))/ ( демо ) или /d s*.s*([wW]*?)(?=[aA]))/ .

Ответ №1:

Похоже, что окончания строк в целевой среде являются CRLF.

В варианте регулярных выражений ECMAScript a . по умолчанию не соответствует символам возврата каретки. Итак, n недостаточно сопоставить разрыв строки.

Есть несколько способов исправить эту проблему. Вы можете изменить текущее регулярное выражение, чтобы убедиться, что вы соответствуете окончаниям строк CRLF / LF / CR:

 /d s*.s*((?:. (?:rn?|n))*?(?=[aA])))/
 

Посмотрите эту демонстрацию регулярных выражений. Здесь (?:rn?|n) соответствует CR и необязательной последовательности символов LF или одному символу LF.

Или вы можете просто сопоставить любой ноль или более символов:

 /d s*.s*([wW]*?)(?=[aA]))/
 

Посмотрите эту демонстрацию регулярных выражений.

Обратите внимание, что я заменил ? на *? , на всякий случай, если между числом с точкой и могут быть пустые значения a) . Это [wW]*? обычный обходной путь для сопоставления любых нулевых или более символов.