Java - расщепление со словами и символами - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть строка типа String str = "void Write(int *p,int a)" Я хочу получить имя функции "str" ​​и имена параметров "* p", "a".Однако я не буду знать, сколько существует параметров.

Я написал "int\\s+|void\\s+|string\\s+|float\\s+|double\\s+|char\\s+\\(,\\)" для регулярного выражения.

Часть 1 = Write( Часть 2 = *p, Часть 3 = a)

Последняя часть регулярного выражения \\(,\\) предназначена для удаления точек с запятой и скобок.Но это не удалось, как вы видите.Нужно ли использовать второй сплит или есть другой способ?

1 Ответ

0 голосов
/ 24 февраля 2019

Это будет двухэтапный процесс

Шаг 1: Извлечение функционального имени и всех аргументов

Шаг 2: Извлечение каждого имени аргумента из списка всех аргументов

Шаг 1:

Позволяет применить это регулярное выражение ^\S+\s+([^(]+)\(([^)]+)* к этой строке void Write(int *p,int a, int b, str *v) эта тестовая строка

^         # start of string
\S+       # one or more occurence of any non space charactcers
          # matches `void`
\s+       # one or more occurence of a space character
          # matches the space after `void`
([^(]+)   # all characters until opening parenthesis
          # matches `Write` and capture it
\(        # literally matches opening parenthesis
([^)]+)   # matches all characters till closing parenthesis is encountered
          # matches arguments signature i.e. `int *p,int a, int b, str *v`
*         # matches zero or more occurrence of last capturing group
          # last capturing group is string between the parenthesis
          # so this star handle the corner case when the argument list is empty

Подробнее: https://regex101.com/r/0m1vs9/2

Шаг 2

Теперь к списку аргументов (int *p,int a, int b, str *v) примените это регулярное выражение \s*\S+\s+([^,]+),? с глобальным модификатором

Этот шаблон сопоставляет текст между запятыми, поэтому давайте объясним шаблоны, предполагая одинаковые

\s*      # matches zero or more occurrences of a space character
         # this will match any spaces after comma e.g. `int b,<space> str`
\S+      # one or more occurrence of non space character
         # matches argument type, i.e. `int`
\s+      # one or more occurrence of space characters
         # matches the space between argument name and type, e.g. `int<space>b`
([^,]+)  # capture all characters till comma
         # this matches the actual argument name
         # and also matches any spaces after it
,?       # zero or one occurrence of a comma
         # this ensures that the argument name is immediately followed by a comma
         # this also handles the case for the last argument which doesn't have any comma after it

Подробнее: https://regex101.com/r/9ju60l/1

Надеюсь, что поможет

...