Регулярное выражение для поиска слов (используя границу слова), где слова включают тире - PullRequest
1 голос
/ 23 июля 2010

С учетом следующего регулярного выражения:

\ б (MyString | MyString-тире) \ б

И текст:

AString MyString MyString-Даш

Выполнение совпадения с текстом никогда не находит совпадения для второй вещи (MyString-Dash), поскольку символ '-' (тире) не является символом границы слова. Следующий javascript всегда выводит «MyString, MyString» в div «соответствия» (я хотел бы найти MyString и MyString-Dash как различные соответствия). Как определить шаблон, который будет соответствовать как MyString, так и MyString-Dash?

<html>
<body>
    <h1>Content</h1>
    <div id="content">
        AString
        MyString
        MyString-Dash
    </div>
    <br>
    <h1>Matches (expecting MyString,MyString-Dash)</h1>
    <div id="matches"></div>
</body>
<script>
    var content = document.getElementById('content');
    var matchesDiv = document.getElementById('matches');
    var pattern = '\\b(MyString|MyString-Dash)\\b';
    var matches = content.innerHTML.match(pattern);
    matchesDiv.innerHTML = matches;
</script>
</html>

Ответы [ 3 ]

1 голос
/ 18 ноября 2010

Пожалуйста, посмотрите этот ответ о том, как обращаться со словами с тире в них и вопросами, связанными с границами, когда у вас есть такие слова.

1 голос
/ 23 июля 2010

Поменяйте местами порядок соответствия, чтобы сначала было самое длинное из возможных:

content.innerHTML.match(/\b(MyString-Dash|MyString)\b/)

Я считаю, что регулярные выражения совпадают слева направо.Только что проверил это в Firebug, он работает.

Я бы также изменил этот шаблон var на литерал регулярного выражения, с '\\b(MyString-Dash|MyString)\\b' до /\b(MyString-Dash|MyString)\b/g

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

0 голосов
/ 23 июля 2010

Есть пара проблем с вашими предположениями.

Выполнение совпадения с текстом никогда не находит совпадения для второй вещи (MyString-Dash), поскольку символ '-' (тире) не является символом границы слова.

Нет такой вещи, как символ границы слова. Границы слова - это пробелы между символами, которые соответствуют \w и не соответствуют \w. - не соответствует '\ w', поэтому по обе стороны от него находится "граница слова", но это не нарушит ваше совпадение: - - буквальная черта в вашем регулярном выражении, а \b - это далеко за его пределами.

Во-вторых, регулярное выражение всегда будет пытаться найти первое, что может в строке, соответствующей вашему регулярному выражению. Пока первая строка там совпадает, она будет возвращать первую вещь там. Вы запрашиваете первый матч, когда вы просите матч. Это дизайн. Если вы не хотите, чтобы он совпадал с MyString, не спрашивайте его.

В-третьих, большинство движков регулярных выражений отдают приоритет «завершению матча» по длине матча. Таким образом, «MyString», если он совпадает, всегда будет первым, что он возвращает. Вам придется подождать, пока в Perl 6 грамматик не появится движок регулярных выражений с приоритетом длины. :)

Единственный способ для вас сделать это с помощью двух проверок: одна для более длинной, первая, а затем другая для более короткой. Это всегда будет соответствовать первому, что он найдет, что работает. Если у вас есть какой-то другой приоритет, вы должны его кодировать как отдельные проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...