2016-08-14 3 views
2

Следующая программа perl имеет регулярное выражение, написанное для моей цели. Но это также фиксирует результаты, присутствующие в строке. Как я могу получить только строки, разделенные пробелами/новыми символами/вкладками?Как найти все слова, начинающиеся с | b и заканчивающиеся на | b. (Пример: «наречие» и «балалайка»)

Тест данных Я присутствует ниже: http://sainikhil.me/stackoverflow/dictionaryWords.txt

use strict; 
use warnings; 

sub print_a_b { 
    my $file = shift; 

    $pattern = qr/(a|b|A|B)\S*(a|b|A|B)/; 
    open my $fp, $file; 

    my $cnt = 0; 
    while(my $line = <$fp>) { 
     if($line =~ $pattern) { 
      print $line; 
      $cnt = $cnt+1; 
     } 
    } 
    print $cnt; 
} 

print_a_b @ARGV; 

ответ

3

Вы могли бы рассмотреть возможность использования anchor like \b: word boundary

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

\b(a|b|A|B)\S*(a|b|A|B)\b 

Simpler как Avinash Raj добавляет in the comments:

(?i)\b[ab]\S*[ab]\b 

(с использованием case insensitive flag or modifier)

+1

ПОЦЕЛУЙ '\ б [аб] \ S * [аб] \ b' –

+2

Более четкому форму' (? я) (?

+0

@AvinashRaj Я всегда стараюсь избегать первых взглядов (положительных, отрицательных), но в зависимости от исходного материала это может иметь смысл. По крайней мере, по крайней мере, нет возврата. – VonC

1

Если у вас есть несколько слов в одной и той же линии, то вы можете использовать границы слов в регулярном выражении, как это :

(?i)\b[ab][a-z]*[ab]\b 

Regular expression visualization

Код картины:

$pattern = /\b[ab][a-z]*[ab]\b/i; 

Однако, если вы хотите, чтобы проверить линии имеют только слово, то вы можете использовать:

(?i)$[ab][a-z]*[ab]$ 

Update: за ваш комментарий * линии, которые начинаются и заканчиваются одним и тем же символом *, вы можете использовать это регулярное выражение:

(?i)\b([a-z])[a-z]*\1\b 

Но i е вы хотите любой характер и не буквы только как выше вы можете использовать: (? я)

(?i)\b(.)[a-z]*\1\b 
+0

Есть ли какой-либо общий способ найти все строки, которые начинаются и заканчиваются одним и тем же символом? Не только 'a' или 'b' – saint1729

+0

@ saint1729 использовать [backtrack] (http://stackoverflow.com/q/9011592/995714). '\ b ([ab]) \ S * \ 1 \ b' –

+0

@ saint1729 Я обновил ответ с регулярным выражением для вашего комментария –

Смежные вопросы