Разбить строку, используя пробел, если он не окружен указанными c символами - PullRequest
2 голосов
/ 03 мая 2020

Мне нужно разбить строку, используя пробел, но соберите вместе слова, окруженные указанным c символом. Указанные c символы могут быть `, * или **.

. Позвольте мне привести пример:

The `String class` represents character strings.
All *string literals* in **Java programs**, such as **abc**

Я хочу получить такой результат:

The
`String class`
represents
character
strings.
All
*string literals*
in
**Java programs**
,
such
as
**abc**

Я могу написать регулярное выражение, которое разделяет мою входную строку на части, если у меня только один вид маркерного символа. Но, к сожалению, у меня есть маркеры умножения.

Это регулярное выражение, которое я использую в своем коде: [^\s"]+|"[^"]*("|$). Это прекрасно работает только с одним маркером:

String marker = "`";
String data = "The `String class` represents character strings. All *string literals* in **Java programs**, such as **abc**...";

String regexp = "[^\\s" + marker + "]+|" + marker + "[^" + marker + "]*(" + marker +"|$)";
Pattern pattern = Pattern.compile(regexp);
Matcher regexMatcher = pattern.matcher(data);

while (regexMatcher.find()) {
    System.out.println(regexMatcher.group());
}

Вывод:

The
`String class`
...
*string
literals*
in
**Java
programs**,
such
as
**abc**...

Я попытался вставить несколько маркеров, но следующее решение не работает:

String marker = "`|\*"

Я могу написать java код для выполнения этой работы, но я подумал, что с помощью regexp может быть проще. Но я не уверен в этом сейчас.

1 Ответ

2 голосов
/ 03 мая 2020

Вы можете извлечь их с помощью

`[^`]*`|(\*{1,2}).*?\1|\S+

См. proof . Этот шаблон будет соответствовать строкам между обратными чертами, одинарными или двойными звездочками и любыми фрагментами без пробелов.

Использовать двойную обратную косую черту sh в Java коде:

String regex = "`[^`]*`|(\\*{1,2}).*?\\1|\\S+";
...