Поиск и замена регулярных выражений - PullRequest
3 голосов
/ 21 ноября 2011

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

Так, например, я хочу заменить слово «мальчик» на «группа», а «мальчики» на «группы»

text.replace( /\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>" );

Однако, $ 2 не подходит с дополнительными "s".

Спасибо заранее!

Ответы [ 4 ]

8 голосов
/ 21 ноября 2011

Просто измените [\w]+ на [\w]+?.

Это изменится

из "жадного" (соответствует как можно большему количеству символов и бросает символы только при необходимости)
что означает, что s? не будет соответствовать, потому что [\w]+ уже сделал это для нас. (неправильное поведение)

до «ленивый» (сопоставить как можно меньше символов, добавляя к совпадению только в случае крайней необходимости)
что дает s? возможность совпадения. (правильное поведение)

Кстати: вы можете изменить [\w]+? на \w+?, и он будет работать точно так же.

1 голос
/ 21 ноября 2011

[\w]+ уже соответствует "s".Решение состоит в том, чтобы [\w]+ соответствовало как можно меньшему количеству, а не как можно большему количеству, с "?"модификатор.Таким образом:

\b(b)[\w]+?(s?)\b
0 голосов
/ 13 октября 2017

Продолжая с вопроса PHP Regex - Как найти версию слова в единственном или множественном числе

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

function add_highlight($content,$term)
{
    //always remove last s if it exists
    //and could use similar strategy to test other endings such as -es and -ies
    //by conditionally building the regex test string based on term's ending
    $term_no_s = rtrim($term,"s"); 
    return preg_replace("/({$term_no_s}s)|({$term_no_s})/i", "<span class='highlight'>$0</span>", $content);
}
0 голосов
/ 21 июня 2017

Просто используйте шаблон как /\b(([A-Za-z]{3,})+(s))\b/

$text="boys";
echo preg_replace('/\b(([A-Za-z]{3,})+(s))\b/','$2',$text); //output "boy"
...