что такое регулярное выражение?

Вы также можете использовать метод compareTo() для сравнения двух строк. Если результат compareTo равен 0, то две строки равны, в противном случае сравниваемые строки не равны.

== сравнивает ссылки и не сравнивает фактические строки. Если вы создали каждую строку, используя new String(somestring).intern(), вы можете использовать оператор == для сравнения двух строк, в противном случае могут использоваться только методы equals () или compareTo.

13
задан Alan Moore 6 July 2009 в 18:33
поделиться

3 ответа

Regular expressions first came around in mathematics and automata theory. A regular expression is simply something which defines a regular language. Without going too much into what "regular" means, think of a language as this way:

  1. A language is made up of strings. English is a language, for example, and its made of strings.
  2. Those strings are made of symbols - called an alphabet. So a string is just a concatenation of symbols from the alphabet.

So you could have a string (which is, remember, just a concatenation of symbols) which is not part of a given language. Or it could be in the language.

So lets say you have an alphabet made of 2 symbols: "0" and "1". And lets say you want to create a language using the symbols in that alphabet. You could create the following rule: "In order for a string to be in my language, it must have only 0's and 1's in it."

So these strings are in your language:

  • 0
  • 1
  • 01
  • 11001101
  • ...etc

These would not be in your language:

  • 2
  • peaches
  • 00101105

That's a pretty simple language. How about this: "In my language, each string [analogous to a valid 'word' in English] must being with a 0, and then can be followed by any number of 0's or 1's"

These are in the language:

  • 0111111
  • 0000000
  • 0101010110001

These are not:

  • 1
  • 10000
  • 1010
  • 2000000

Well rather than defining the language using words - and these languages might get very complex ("1 followed by 2 0's followed by any combination of 1's and 0's ending with a 1"), we came up with this syntax called "regular expressions" to define the language.

The first language would have been:

(0|1)*

(0 or 1, repeated infinitely)

The next: 0(0|1)*

(0, followed by any number of 0's and 1's).

So lets think of programming now. When you create a regex, you are saying "Look at this text. Return to me strings which match this pattern." Which is really saying "I have defined a language. Return to me all strings within this document which are in my language."

So when you create a "regex", you are actually defining a regular language, which is a mathematical concept. (In actuality, perl-like regex define "nonregular" languages, but that is a separate issue.)

By learning the syntax of regex, you are learning the ins and outs of how to create a language, so that later you can see if a given string is "in" the language. Thus, commonly, people say that regex are for pattern matching - which is basically what you are doing when you look at a pattern, and see if it "matches" the rules for your language.

(this was long. does it answer your question at all?)

35
ответ дан 1 December 2019 в 17:38
поделиться

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

Вы также можете делать гораздо более сложные вещи с помощью регулярных выражений. На эту тему есть отличная книга О'Рейли и множество примеров в сети.

То, что вы не можете сделать с регулярными выражениями, - это правильный синтаксический анализ, потому что регулярные выражения не являются достаточным языком для кодирования грамматики. Они специализируются на сопоставлении с образцом, и если вы попытаетесь использовать их для синтаксического анализа чего-то вроде XML, у вас, скорее всего, возникнут проблемы в будущем. В частности, вы не можете анализировать произвольно вложенные рекурсивные структуры с помощью регулярных выражений. Простой пример проблемы, которую регулярное выражение может ' t resolve well - это набор вложенных фигурных скобок, как в C:

int main() {    
    void func() {
    }   
}

Вы можете заставить регулярные выражения решать эту задачу до определенного момента, но требования к памяти для этого неограниченно возрастают по мере роста количества фигурных скобок. Если вас интересуют более подробные сведения, прочтите этот другой вопрос StackOverflow о том, почему такую ​​конструкцию трудно анализировать с помощью регулярных выражений:

Можно ли использовать регулярные выражения для сопоставления вложенных шаблонов?

В разных языках регулярные выражения реализуются по-разному. способов, но реализация Perl очень популярна. Семейство регулярных выражений, совместимых с Perl, называется PCRE, или P erl- C ompatible R egular E xpressions. Вот пример регулярного выражения на Perl, которое может соответствовать целым числам:

#!/usr/bin/perl

use strict;
use warnings;

match_string( "one-two" );
match_string( "1-2" );

sub match_string {
   my $string = shift;
   if ( $string =~ /(\d+)/ ) {
      print "$string matches!\n";
      print "matched: ", $1, "\n";
   } else {
      print "$string doesn't match!\n";
   }
}  

$ perl test.pl 
one-two doesn't match!
1-2 matches!
matched: 1

В этом примере регулярное выражение соответствует одному или нескольким примерам цифры. Вот строка:

   if ( $string =~ /(\d+)/ ) {

Это можно прочитать так:

  • внутри условного, строка сопоставляется с регулярным выражением между /.
  • символ \ d переводится в цифру, 0-9 .
  • знак + означает «один или несколько раз».
  • скобки () означают захват этого совпадения и помещают его в специальную переменную. Поскольку это первое совпадение, оно помещается в $ 1.

В некоторых языках (например, Perl) вы также можете использовать регулярные выражения для выполнения подстановок, например:

substitute_string( "one-two" );
substitute_string( "1-2" );

sub substitute_string {
   my $string = shift;
   print "before: ",  $string, "\n";
   $string =~ s/1/one/g;
   $string =~ s/2/two/g;
   print "after: ",  $string, "\n";
}

$ perl test.pl 
before: one-two
after: one-two
before: 1-2
after: one-two

Надеюсь, этого достаточно, чтобы вы начали!

строка сопоставляется с регулярным выражением между /.
  • символ \ d преобразуется в цифру 0-9.
  • + означает «один или несколько раз».
  • скобки () mean захватить это совпадение и поместить его в специальную переменную. Поскольку это первое совпадение, оно помещается в $ 1.
  • В некоторых языках (например, Perl) вы также можете использовать регулярные выражения для выполнения подстановок, например:

    substitute_string( "one-two" );
    substitute_string( "1-2" );
    
    sub substitute_string {
       my $string = shift;
       print "before: ",  $string, "\n";
       $string =~ s/1/one/g;
       $string =~ s/2/two/g;
       print "after: ",  $string, "\n";
    }
    
    $ perl test.pl 
    before: one-two
    after: one-two
    before: 1-2
    after: one-two
    

    Надеюсь, этого достаточно, чтобы вы начали!

    строка сопоставляется с регулярным выражением между /.
  • символ \ d преобразуется в цифру 0-9.
  • + означает «один или несколько раз».
  • скобки () mean захватить это совпадение и поместить его в специальную переменную. Поскольку это первое совпадение, оно помещается в $ 1.
  • В некоторых языках (например, Perl) вы также можете использовать регулярные выражения для выполнения подстановок, например:

    substitute_string( "one-two" );
    substitute_string( "1-2" );
    
    sub substitute_string {
       my $string = shift;
       print "before: ",  $string, "\n";
       $string =~ s/1/one/g;
       $string =~ s/2/two/g;
       print "after: ",  $string, "\n";
    }
    
    $ perl test.pl 
    before: one-two
    after: one-two
    before: 1-2
    after: one-two
    

    Надеюсь, этого достаточно, чтобы вы начали!

    14
    ответ дан 1 December 2019 в 17:38
    поделиться

    Другие люди рассказали, что такое регулярное выражение и для чего его можно использовать, поэтому я не буду перефразировать предыдущие ответы. Однако, если вам интересно узнать о синтаксисе регулярных выражений (например, о том, как построить регулярное выражение), посмотрите раздел Tutorial на сайте regular-expression.info; это, вероятно, самый подробный ресурс синтаксиса регулярных выражений в Интернете.

    2
    ответ дан 1 December 2019 в 17:38
    поделиться
    Другие вопросы по тегам:

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