Я хочу найти и отделить слова в названии, в котором нет пробелов.
До:
ThisIsAnExampleTitleHELLO-WORLD2019T.EST(Test) "Тест" 'Test' [Тест]
После:
Это пример названия HELLO-WORLD 2019 TEST (Тест) [Тест] "Тест" "Тест"
Я ищу правило регулярного выражения, которое может сделать следующее.
Я думал, что опознаю каждое слово, если оно начинается с заглавной буквы.
Но также сохраните все заглавные слова, чтобы не ALLUPPERCASE
их в ALLUPPERCASE
.
Дополнительные правила:
- Пробел, если он касается числа:
Hello2019World
Hello 2019 World
- Игнорировать интервал инициалов, которые содержат, дефисы, или подчеркивает
TEST
- Игнорировать интервал, если между скобками, скобками или кавычками
[Test] (Test) "Test" 'Test'
- Сохранить дефис
Hello-World
С#
https://rextester.com/GAZJS38767
// Title without spaces
string title = "ThisIsAnExampleTitleHELLO-WORLD2019T.E.S.T.(Test)[Test]\"Test\"'Test'";
// Detect where to space words
string[] split = Regex.Split(title, "(?<!^)(?=(?<![.\\-'\"([{])[A-Z][\\d+]?)");
// Trim each word of extra spaces before joining
split = (from e in split
select e.Trim()).ToArray();
// Join into new title
string newtitle = string.Join(" ", split);
// Display
Console.WriteLine(newtitle);
Регулярное выражение
У меня проблемы с пробелами перед числами, скобками, скобками и кавычками.
https://regex101.com/r/9IIYGX/1
(?<!^)(?=(?<![.\-'"([{])(?<![A-Z])[A-Z][\d+?]?)
(?<!^) // Negative look behind
(?= // Positive look ahead
(?<![.\-'"([{]) // Ignore if starts with punctuation
(?<![A-Z]) // Ignore if starts with double Uppercase letter
[A-Z] // Space after each Uppercase letter
[\d+]? // Space after number
)
Решение
Спасибо за все ваши совлокальные усилия в ответах. Вот пример Regex. Я применяю это к именам файлов и исключаю специальные символы \/:*?"<>|
.