Domanda

Ho un'espressione regex che sto usando per trovare tutte le parole in un determinato blocco di contenuti, case insensitive, che sono contenuti in un glossario memorizzata in un database. Ecco il mio modello:

/($word)/i

Il problema è che, se uso /(Foo)/i poi parole come Food vengono abbinati. Ci deve essere spazio bianco di confine o una parola su entrambi i lati della parola.

Come posso modificare la mia espressione per abbinare solo la parola Foo quando si tratta di una parola all'inizio, al centro o fine di una frase?

È stato utile?

Soluzione

frontiere utilizzare Word:

/\b($word)\b/i

Se siete alla ricerca di "S.P.E.C.T.R.E." come nell'esempio di Sinan Unur:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i

Altri suggerimenti

Per abbinare qualsiasi parola intera si può usare il modello (\w+)

Supponendo che si sta utilizzando PCRE o qualcosa di simile:

entrare descrizione dell'immagine qui

Sopra screenshot preso da questo esempio dal vivo: http://regex101.com/r/cU5lC2

corrispondenza qualsiasi parola intera sulla riga di comando con (\w+)

Sarò utilizzando il phpsh interattivo shell su Ubuntu 12.10 per dimostrare la motore di espressione regolare PCRE attraverso il metodo noto come preg_match

Avvia phpsh, mettere un po 'contenuto in una variabile, partita sulla parola.

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

Il metodo preg_match utilizzato il motore PCRE all'interno del linguaggio PHP per analizzare le variabili: $content1, $content2 e $content3 con il modello (\w)+.

$ content1 e $ content2 contengono almeno una parola, $ content3 non lo fa.

corrispondere un numero di parole letterali sulla riga di comando con (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

variabili gun1 e gun2 contengono il dardo stringa o scoreggia. gun4 non lo fa. Tuttavia può essere un problema che cerca di parola fart partite farty. Per risolvere questo problema, rispettare i limiti di parola in regex.

corrispondere le parole letterali sulla riga di comando con i confini di parola.

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

Quindi è lo stesso dell'esempio precedente, tranne che la parola fart con un limite di parola \b non esiste nel contenuto: farty.

Utilizzando \b può produrre risultati sorprendenti. Si sarebbe meglio cercare di capire ciò che separa una parola dalla sua definizione e incorporando le informazioni in vostro modello.

#!/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";
}

Output:

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"

frontiere uso di parola \ b,

I seguenti (utilizzando quattro fughe) lavora nel mio ambiente: Mac, Safari versione 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)

Se si sta facendo in Notepad ++

[\w]+ 

darebbe l'intera parola, ed è possibile aggiungere le parentesi per farlo come un gruppo. Esempio: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs). Vorrei spostare LeakyReLU nella propria linea come un commento, e sostituire l'attivazione corrente. In Notepad ++ questo può essere fatto utilizzando il comando seguire trovare:

([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)

e il comando di sostituzione diventa:

\1\2'relu'\4 \n    # \1 = LeakyReLU\(alpha=a\)\(\1\)

Gli spazi è quello di mantenere la formattazione a destra nel mio codice. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top