Регулярные выражения - PullRequest
2 голосов
/ 17 апреля 2010

Мне нужно регулярное выражение для поиска шаблона. Это шаблон:
идентификатор | имя | код | мобильный
Я создал шаблон для этого, если я хочу искать по id (если id = 1):

.*1.*|.*|.*|.*

Но это соответствует каждому шаблону, который содержит номер 1. В чем проблема с этим?

Ответы [ 4 ]

3 голосов
/ 17 апреля 2010

Вам необходимо экранировать символ | в регулярных выражениях, иначе это означает чередование. Также полезно использовать якоря, если вы сомневаетесь, нужны ли они для вашей библиотеки регулярных выражений. Это выражение соответствует всему, что содержит 1 в id:

^.*1.*\|.*\|.*\|.*$

Чтобы точно соответствовать id = 1, измените его на:

^1\|.*\|.*\|.*$

Для точного соответствия имени = 'Foo':

^.*\|Foo\|.*\|.*$

В комментариях следует отметить, что было бы неплохо использовать [^|]* вместо .*, чтобы гарантировать, что данные имеют правильное количество символов канала.

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

2 голосов
/ 19 сентября 2012

Я думал, что ваше требование заключается в том, что идентификатор должен начинаться с "1", поэтому я создал пример кода на Perl с простым регулярным выражением. Не стесняйтесь задавать больше вопросов.

my $pattern1="1|ee|ew|56";
my $pattern2="001|90|34|06";
my $pattern3="009|56|09|16";
my $pattern4="003|67|87|76";

if ($pattern1 =~ m/^1/){
print "Match Found for : $pattern1\n";
}
elsif ( $pattern2 =~ m/^1/){
print "Match Found for : $pattern2\n";
}
elsif ($pattern3 =~ m/^1/){
  print "Match Found for : $pattern3\n";
}
elsif ($pattern4 =~ m/^1/){
  print "Match Found for : $pattern4\n";
}
else{
  print "No Match Found";
}
1 голос
/ 17 апреля 2010

Из одного из ваших комментариев:

Спасибо, хорошо, но мне нужно регулярно выражения, потому что я пытаюсь разобрать файл в Java, я знаю, что это странно, но мне нужно знать место в файл, в котором находится искомая строка начинается. :)

Почему бы не нажать http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#split(java.lang.String) и использовать предложенную технику ghostdog74. Целое регулярное выражение серьезно излишне для того, что вы хотите сделать.

1 голос
/ 17 апреля 2010

думаю просто. Нет необходимости в регулярных выражениях. Если я правильно вас понял, вы ищете идентификатор, скажем, 1, и, поскольку ваши данные имеют четкий разделитель, то есть (pipe |), просто разбейте ваши данные на отдельные части, используя pipe в качестве разделителя с вашим любимым языком. и проверьте первый элемент (id) против 1. например,

awk -F"|" '$1==1{print}' file

Python

>>> s="1|John|code|mobile"
>>> if s.split("|")[0] == "1":
...  print "found"
...
found

должно быть несколько функций разделения строк, которые вы можете использовать с предпочитаемым вами языком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...