Как заменить шаблон только в том случае, если он полностью совпадает с [duplicate]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

65
задан Eric Leschinski 6 January 2014 в 19:54
поделиться

4 ответа

Используйте границы слов:

/\b($word)\b/i

Или если вы ищете «S.P.E.C.T.R.E.» как в примере Синан Юньер:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i
87
ответ дан Richard Simões 19 August 2018 в 04:42
поделиться
  • 1
    Я просто набрал длинную версию этого ответа, когда вы разместили сообщение. :) – ZombieSheep 17 November 2009 в 20:52
  • 2
    @RichardSimoes \b(<|>=)\b не соответствует >= – alhelal 21 January 2018 в 02:40
  • 3
    @RichardSimoes и \b[-|+][0-9]+\b соответствуют +10 в 43E+10. И я не хочу. – alhelal 21 January 2018 в 02:47

Чтобы соответствовать любому целому слову, вы должны использовать шаблон (\w+)

Предполагая, что вы используете PCRE или что-то подобное:

enter image description here [/g9]

Над скриншотом, взятым из этого живого примера: http://regex101.com/r/cU5lC2

Соответствие любому целому слову в командной строке с помощью (\w+)

Я буду использовать интерактивную оболочку phpsh на Ubuntu 12.10 , чтобы продемонстрировать механизм регулярного выражения PCRE с помощью метода, известного как ] preg_match

Запустить phpsh, поместить некоторый контент в переменную, совпадение по слову.

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

Метод preg_match использовал механизм PCRE на языке PHP для анализа переменные: $content1, $content2 и $content3 с рисунком (\w)+.

$ content1 и $ content2 содержат хотя бы одно слово, а $ content3 - нет.

Сопоставьте ряд буквальных слов в командной строке с (dart|fart)

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(dart|fart)', $gun1);
1

php> echo preg_match('(dart|fart)', $gun2);
1

php> echo preg_match('(dart|fart)', $gun3);
1

php> echo preg_match('(dart|fart)', $gun4);
0

переменные gun1 и gun2 содержат струнные дротики или пердеть. gun4 нет. Однако может возникнуть проблема, когда поиск слова fart соответствует farty. Чтобы исправить это, применяйте границы слова в регулярном выражении.

Сопоставьте литеральные слова в командной строке со слоями.

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

Итак, это то же самое, что и в предыдущем примере, за исключением того, что слово fart с границей слова \b в содержании не существует: farty.

32
ответ дан Eric Leschinski 19 August 2018 в 04:42
поделиться
  • 1
    до полудня после полудня. это не слова? – minion 27 June 2018 в 17:28
  • 2
    для большинства систем ни периоды, ни запятые не являются символами слов. Кроме того, aint не является словом, очистите свой лексикон, и в будущем вам не нужно будет обращаться за помощью в таких тривиальных вопросах. – Eric Leschinski 27 June 2018 в 17:30

Использование \b может дать неожиданные результаты. Вам будет лучше выяснить, что отделяет слово от его определения и включает эту информацию в ваш шаблон.

#!/usr/bin/perl

use strict; use warnings;

use re 'debug';

my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';

my $word = 'S.P.E.C.T.R.E.';

if ( $str =~ /\b(\Q$word\E)\b/ ) {
    print $1, "\n";
}

Выход:

Compiling REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
Final program:
   1: BOUND (2)
   2: OPEN1 (4)
   4:   EXACT  (9)
   9: CLOSE1 (11)
  11: BOUND (12)
  12: END (0)
anchored "S.P.E.C.T.R.E." at 0 (checking anchored) stclass BOUND minlen 14
Guessing start of match in sv for REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P
.E.C.T.R.E. (Special Executive for Counter-intelligence,"...
Found anchored substr "S.P.E.C.T.R.E." at offset 0...
start_shift: 0 check_at: 0 s: 0 endpos: 1
Does not contradict STCLASS...
Guessed: match at offset 0
Matching REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P.E.C.T.R.E. (Special Exec
utive for Counter-intelligence,"...
   0           |  1:BOUND(2)
   0           |  2:OPEN1(4)
   0           |  4:EXACT (9)
  14      |  9:CLOSE1(11)
  14      | 11:BOUND(12)
                                  failed...
Match failed
Freeing REx: "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
8
ответ дан Sinan Ünür 19 August 2018 в 04:42
поделиться
  • 1
    Я думаю, что слово обычно будет словом \ w, но интересным. – Richard Simões 17 November 2009 в 21:09

использовать границы слов \ b,

В моей среде работает следующее (с использованием четырех экранов): Mac, safari Version 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
0
ответ дан X. L 19 August 2018 в 04:42
поделиться
Другие вопросы по тегам:

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