формирование правильного регулярного выражения в динамической строке - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть FileInputStream, который читает файл, который где-то содержит подмножество строк, похожее на:

...
    OperatorSpecific(XXX)
    {
       Customer(someContent)
       SaveImage()
       {
...

Я хотел бы идентифицировать Customer(someContent) часть строки и переключить someContent внутри скобки длячто-то еще.

someContent будет динамическим параметром и будет содержать строку из 5-10 символов.

Ранее я использовал regEx, как один или два раза, но я чувствую, что втакой контекст, в котором я не знаю, какое значение будет в скобках, я не знаю, как это выразить ...

В заключение я хочу, чтобы мне вернули строку, котораяимеет значение someContent в скобках Customer.

У кого-нибудь есть какие-нибудь блестящие идеи о том, как это сделать?

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Попробуйте это (удвойте обратную косую черту для использования в java!)

(?<=Customer\()[^\)]*

И замените ее своим контентом.

См. здесь, в Regexr

(?<=Customer\() - взгляд за утверждением.Он проверяет в каждой позиции, есть ли «Клиент (» слева, если да, то он совпадает справа, все символы, которые не являются «)» с [^\)]*, тогда эта часть будет заменена.

Какой-то рабочий код Java

Pattern p = Pattern.compile("(?<=Customer\\()[^\\)]*");
String original = "Customer(someContent)";
String Replacement = "NewContent";

Matcher m = p.matcher(original);
String result = m.replaceAll(Replacement);

System.out.println(result);

Будет напечатано

Customer (NewContent)

0 голосов
/ 25 ноября 2011

Использование групповых работ и не жадных работ:

String s = 
    "OperatorSpecific(XXX)\n    {\n" +
    "       Customer(someContent)\n" +
    "       SaveImage()       {";
Pattern p = Pattern.compile("Customer\\((.*?)\\)");
Matcher matcher = p.matcher(s);
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

напечатает

someContent
0 голосов
/ 25 ноября 2011

Не проверено, но должно работать что-то вроде следующего:

Pattern pattern = Pattern.compile("\\s+Customer\\(\\s*(\\w+)\\s*\\)\\s*");
Matcher matcher = pattern.matcher(input);
matcher.matches();

System.out.println(matcher.group(1));

РЕДАКТИРОВАТЬ

Это, конечно, не будет работать во всех возможных случаях:

// legal variable names
Customer(_someContent)
Customer($some_Content)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...