2009-12-06 2 views
0

Мне нужно написать регулярное выражение, чтобы убедиться, что строка содержит {}, но не {или}. Может кто-нибудь светит на это, пожалуйста?Регулярное выражение для проверки того, что строка содержит {}

Спасибо за помощь, вот несколько примеров.

например.

действует: {ABC}, as09 {02} дд, {sdjafkl} sdjk, sfdsjakl, 00 {00} 00, ааааа {d}

недействительна: {SDSF, sdfadf}, SDF {SDFS, 333 } 333

********* Обновление *******************

^[A-Za-Z0-9_-. ] (?: {[A-zA-Z0-9 _-.] +})? [A-zA-Z0-9_-. ] $ это то, что мне нужно, спасибо за вашу помощь :)

+0

Не могли бы вы уточнить? Это точно «{}» (без каких-либо промежуточных символов), которые вы хотите? Или вы просто подразумеваете, что строка содержит как {и}, но не только одну из них? Как насчет нескольких {и}? Требования неоднозначны. –

+0

Может ли {} быть вложенным? – Andomar

+0

Предоставьте несколько входов для образца - ваш вопрос в его нынешнем виде не имеет смысла. – 2009-12-06 21:56:00

ответ

2
/.*\{.*\}.*/ 

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

Если вы хотите поэкспериментировать и протестировать эти регулярные выражения, here's a good site.

+0

Это будет соответствовать "{abc} {", что, вероятно, не то, что он хочет. – fastcodejava

+0

^[a-zA-Z0-9 _ \ - \. ] *: - [A-Za-Z0-9 _ \ - \ (\ {[A-Za-Z0-9 _ \ \] + \.}?). ] * $ то, что мне нужно, спасибо за вашу помощь – Ybbest

1

Какой вкус регулярного выражения? В JavaScript, например, это будет сделать это:

var re = /\{.*\}/; 

alert("A: " + re.test("This {is} a match")); 
alert("B: " + re.test("This {is not a match")); 
alert("C: " + re.test("This } is not a match")); 

оповещения A: true, B: false и C: false.

Большинство других ароматов будут похожими.

+0

'alert (" D: "+ re.test (" Это не должно быть} соответствие ")); ' – Svante

+0

@Svante: В то время, когда я ответил, вопрос не указывал на то, что (нет примеров, практически нет деталей вообще). Черт, я все еще не уверен. :-) –

0

Существует ровно один открывающую скобку и ровно одна закрывающая скобка в строке, а закрывающая скобка следует открывающую фигурную скобку:

^[^\{\}]\{[^\{\}]\}[^\{\}]$ 

Там любое количество скобок в строке, но они не являются вложенными (никогда нет другого открытия скобки прежде, чем предыдущий один был закрыт), и они всегда сбалансированы:

^[^\{\}](\{[^\{\}]\})*[^\{\}]$ 

вложенность не может быть в целом решена регулярными выражениями.

+0

Однако обратите внимание, что большинство языков не используют строго «регулярные» выражения. В качестве примера, регулярное выражение Perl '/ (\ {(?: [^ \ {\}] ++ | (? 1)) * \}) /' будет соответствовать сбалансированным фигурным скобкам. –

1

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


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

I.e.это правильно

{}{{{}{}}} 

в то время как это не

{{} 

Решение в питона (легко перевести на другой язык):

def check(s): 
    counter = 0 
    for character in s: 
     if character == "{": 
      counter += 1 
     elif character == "}": 
      counter -= 1 

     if counter < 0: 
      # not valid 
      return False 

    if counter == 0: 
     # valid 
     return True 
    else: 
     return False 
+0

Я думаю, что этот фрагмент кода содержит синтаксическую ошибку. – Svante

+0

Хорошая точка, фиксированная опечатка. – gorsky

+0

Лексер все равно будет жаловаться. – Svante

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