Измените текст на встроенный TeX с помощью javascript и регулярных выражений

#javascript #regex #math #mathjax

#javascript #регулярное выражение #математика #mathjax

Вопрос:

Я использую регулярное выражение

 /$([^$]*)$/g
 

чтобы заменить текст внутри двух $ на latex.

В javascript я использую

 text.replace(/$([^$]*)$/g, function (str, match) {
    return changeToTeX(match);
}
 

Это работает почти так, как должно, но, например, этот текст

Цена составляет от 400 до 500 долларов.

будет перепутано, потому что он считает, что его следует преобразовать 400 and в latex, поскольку этот текст находится между знаками доллара.

Возможно, это невозможно исправить. Я только что проверил math.stackexchange.com который поддерживает то же поведение, когда текст внутри знаков доллара заменяется latex , но здесь возникает та же проблема, когда весь текст между знаками доллара интерпретируется как latex.

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

1. Поскольку вы отметили это с помощью MathJax, обратите внимание, что препроцессор tex2jax в MathJax более сложный и также предлагает экранирование.

Ответ №1:

Если у вас есть только числа внутри $...$ , используйте

 /$(d )$/g
 

где d соответствует 1 или более цифрам. Шаблон внутри можно улучшить, чтобы он соответствовал любым числам (см. Сопоставление чисел с плавающей запятой с регулярным выражением).

Чтобы сопоставить все, кроме $ и пробелов, используйте

 /$([^s$]*)$/g
 

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

Возможно, чтобы требовать только символы word после первого $ и перед последним $ , используйте

 /B$b([^$]*)b$B/g
 

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

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

1. @Tushar: это только в том случае, если числа в The price is between $400 and $500. должны совпадать. Я понимаю, что в этом предложении не должно быть совпадений.

2. Кажется, это работает 🙂 Но если я напишу $ 2 2 $ с пробелом впереди или напишу $ frac {3} {4} $, это больше не будет работать

3. Ага, так каковы же тогда спецификации? Вы знаете, регулярное выражение может соответствовать только обычному тексту. Позвольте мне угадать: после первого может быть что угодно $ , и перед завершающим может быть что угодно, кроме пробела $ ? И нет $ между ними? Попробуйте /$(?![^$]*s$)([^$]*)$/ .