Ответ 1
Есть довольно (много) различий.
Класс символов
- Вычитание классов символов
[abc-[cde]]
- .NET ДА (2.0)
- Java: Эмуляция через пересечение и отрицание символьного класса:
[abc&&[^cde]]
)
- Пересечение классов символов
[abc&&[cde]]
- .NET: эмулируется путем вычитания и отрицания символьного класса:
[abc-[^cde]]
) - Java ДА
- .NET: эмулируется путем вычитания и отрицания символьного класса:
-
\p{Alpha}
Класс символов POSIX- .NET НЕТ
- Java YES (US-ASCII)
- В режиме
(?x)
COMMENTS
/IgnorePatternWhitespace
пространство (U + 0020) в классе символов является значительным.- .NET ДА
- Java НЕТ
- Unicode Category (L, M, N, P, S, Z, C)
- Только .NET YES:
\p{L}
- Java ДА:
- Из Java 5:
\pL
,\p{L}
,\p{IsL}
- Из Java 7:
\p{general_category=L}
,\p{gc=L}
- Из Java 5:
- Только .NET YES:
- Unicode Category (Lu, Ll, Lt,...)
- Только .NET YES:
\p{Lu}
- Java ДА:
- Из Java 5:
\p{Lu}
,\p{IsLu}
- Из Java 7:
\p{general_category=Lu}
,\p{gc=Lu}
- Из Java 5:
- Только .NET YES:
- Блок Unicode
- Только .NET YES:
\p{IsBasicLatin}
. (Поддерживаемые именованные блоки) - Java ДА: (название блока - свободная оболочка)
- Из Java 5:
\p{InBasicLatin}
- Из Java 7:
\p{block=BasicLatin}
,\p{blk=BasicLatin}
- Из Java 5:
- Только .NET YES:
- Пробелы и подчеркивания, разрешенные во всех длинных именах блоков (например,
BasicLatin
, могут быть записаны какBasic_Latin
илиBasic Latin
)- .NET НЕТ
- Java ДА (Java 5)
Квантор
-
?+
,*+
,++
и{m,n}+
(притяжательные кванторы)- .NET НЕТ
- Java ДА
Цитата
-
\Q...\E
выводит строку метасимволов- .NET НЕТ
- Java ДА
-
\Q...\E
выводит строку метасимволов класса символов (в наборах символов)- .NET НЕТ
- Java ДА
Конструкция соответствия
- Условное соответствие
(?(?=regex)then|else)
,(?(regex)then|else)
,(?(1)then|else)
или(?(group)then|else)
- .NET ДА
- Java НЕТ
- Именованная группа захвата и названная обратная ссылка
- .NET ДА:
- Группа захвата:
(?<name>regex)
или(?'name'regex)
- Backreference:
\k<name>
или\k'name'
- Группа захвата:
- Java ДА (Java 7):
- Группа захвата:
(?<name>regex)
- Backreference:
\k<name>
- Группа захвата:
- .NET ДА:
- Несколько групп захвата могут иметь одно и то же имя
- .NET ДА
- Java НЕТ (Java 7)
- Определение группы балансировки
(?<name1-name2>regex)
или(?'name1-name2'subexpression)
- .NET ДА
- Java НЕТ
утверждения
-
(?<=text)
(положительный lookbehind)- .NET Переменная-ширина
- Java Очевидная ширина
-
(?<!text)
(отрицательный lookbehind)- .NET Переменная-ширина
- Java Очевидная ширина
Параметры режима/флаги
-
ExplicitCapture
опция(?n)
- .NET ДА
- Java НЕТ
Разное
-
(?#comment)
встроенные комментарии- .NET ДА
- Java НЕТ