Есть пара проблем с вашими предположениями.
Выполнение совпадения с текстом никогда не находит совпадения для второй вещи (MyString-Dash), поскольку символ '-' (тире) не является символом границы слова.
Нет такой вещи, как символ границы слова. Границы слова - это пробелы между символами, которые соответствуют \w
и не соответствуют \w
. -
не соответствует '\ w', поэтому по обе стороны от него находится "граница слова", но это не нарушит ваше совпадение: - - буквальная черта в вашем регулярном выражении, а \b
- это далеко за его пределами.
Во-вторых, регулярное выражение всегда будет пытаться найти первое, что может в строке, соответствующей вашему регулярному выражению. Пока первая строка там совпадает, она будет возвращать первую вещь там. Вы запрашиваете первый матч, когда вы просите матч. Это дизайн. Если вы не хотите, чтобы он совпадал с MyString, не спрашивайте его.
В-третьих, большинство движков регулярных выражений отдают приоритет «завершению матча» по длине матча. Таким образом, «MyString», если он совпадает, всегда будет первым, что он возвращает. Вам придется подождать, пока в Perl 6 грамматик не появится движок регулярных выражений с приоритетом длины. :)
Единственный способ для вас сделать это с помощью двух проверок: одна для более длинной, первая, а затем другая для более короткой. Это всегда будет соответствовать первому, что он найдет, что работает. Если у вас есть какой-то другой приоритет, вы должны его кодировать как отдельные проверки.