Какой regex использует для своей выгоды какие-либо буквы после пробела?

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

DtaDisplay1 = ({match}) => {
    const id = match.params.pid;
    return (
      <div>
        <h1>{id}</h1>
      </div>
    );
}

5
задан Chad Birch 3 April 2009 в 22:08
поделиться

7 ответов

В зависимости от Вашей точной проблемы это могло быть более сложно, чем Вы думаете, и простой regex не мог бы работать. Вы думали о капитализации в слове? Что, если слово запускается с пунктуации как '... Word'? Есть ли какие-либо исключения? Что относительно международных символов?

Могло бы быть лучше использовать модуль CPAN как текст:: автоформат или текст:: Используйте для своей выгоды, где эти проблемы были уже решены.

use Text::Capitalize 0.2;
print capitalize_title($t), "\n";

use Text::Autoformat;
print autoformat{case => "highlight", right=>length($t)}, $t;

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

Можно также проверить Поваренную книгу Perl для (страницы 31) recipie 1.14 о том, как использовать regexps для надлежащего превращения в капитал заголовка или заголовка.

8
ответ дан 18 December 2019 в 06:04
поделиться
s/(\s\w)/\U$1\E/g;

Я первоначально предложил:

s/\s\w/\U$&\E/g;

но сигналы тревоги уходили при использовании '$ и' (даже, прежде чем я прочитал комментарий @Manni). Оказывается, что они полностью выравниваются по ширине - использование $ и, $' и $' операции вызывает полную неэффективность в regexes.

\E не очень важен для этого regex; это выключает 'устанавливающий случай' переключатель \U в этом случае или \L для нижнего регистра.


Как отмечено в комментариях, соответствуя первому символу строки требует:

s/((?:^|\s)\w)/\U$1\E/g;

Исправленное положение второй близкой круглой скобки - спасибо, Blixtor.

10
ответ дан 18 December 2019 в 06:04
поделиться

Что-то вроде этого должно добиться цели -

s!(^|\s)(\w)!$1\U$2!g

Это просто разделяет просканированное выражение на два соответствия - 1$ для очищения/начинания строки и 2$ для первого символа слова. Мы затем заменяем и 1$ и 2$ после создания запуска верхнего регистра слова.

Я изменил бы \s на \b, который имеет больше смысла, так как мы проверяем на границы слова здесь.

7
ответ дан 18 December 2019 в 06:04
поделиться

Это не что-то, для чего я обычно использовал бы regex, но мое решение не точно, что Вы назвали бы "красивым":

$string = join("", map(ucfirst, split(/(\s+)/, $string)));

Это split()s строка пробелом и получениями весь пробел, затем проходит каждый элемент списка и делает ucfirst на них (создание первого символьного верхнего регистра), затем join()s их назад вместе как единственная строка. Не ужасный, но возможно Вам понравится regex больше. Мне лично просто не нравится \Q или \U или другие полунеловкие конструкции regex.

Править: Кто-то еще упомянул, что пунктуация могла бы быть потенциальной проблемой. Если, скажем, Вы хотите это:

...string

измененный на это:

...String

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

$string = join("", map(ucfirst, split(/(\w+)/, $string)));

То же самое, но это split()s на словах (\w+) так, чтобы полученные элементы списка были только для слова. Тот же полный эффект, но использует для своей выгоды слова, которые не могут запуститься со словесного символа. Изменение \w кому: [a-zA-Z] устранить попытку использовать для своей выгоды числа. И просто обычно настраивайте его однако, Вам нравится.

1
ответ дан 18 December 2019 в 06:04
поделиться

Если Вы имеете в виду символ после пространства, используйте использование регулярных выражений \s. Если Вы действительно имеете в виду первый символ в слове, необходимо использовать \b вместо всех выше попыток с \s который подвержен ошибкам.

s/\b(\w)/\U$1/g;
1
ответ дан 18 December 2019 в 06:04
поделиться

Вы хотите соответствовать буквам позади пробела, или в начале строки.

Perl не может сделать переменной длины lookbehind. Если это сделало, Вы, возможно, использовали это:

s/(?<=\s|^)(\w)/\u$1/g;    # this does not work!

Perl жалуется:

Variable length lookbehind not implemented in regex;

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

s/(?<!\S)(\w)/\u$1/g;

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

s/(\s|^)(\w)/$1\u$2/g;

Иногда Вы не можете использовать этот подход в повторных заменах, потому что, что то, что предшествует фактическому соответствию, уже съел regex, и хорошо иметь путь вокруг этого.

0
ответ дан 18 December 2019 в 06:04
поделиться

Используйте для своей выгоды ЛЮБОЙ символ, которому предшествует пробел или в начале строки:

s/(^|\s)./\u$1/g

Возможно, очень неаккуратный способ сделать его, потому что это - также uppercasing пробел теперь.:P Преимущество состоит в том, что это работает с буквами со всеми возможными диакритическими знаками (и также со специальными датскими/Шведскими/Норвежскими буквами), которые проблематичны, когда Вы используете \w и \b в Вашем regex. Я могу ожидать, что все небуквы являются нетронутыми прописным модификатором?

0
ответ дан 18 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: