Как разделить слова в Camel Case со специальными заглавными словами внутри?

Я пытаюсь упростить понимание имен конфигураций для моей модели глубокого обучения. Первое, что я должен сделать, это разбить имена конфигураций на токены.
Ввод выглядит так:

allow-nonxdr-writes
io.native.lib.available
ha.zookeeper.parent-znode
min_file_size
ProxyStatus
ProxyFCGIBackendType
SessionDBDCookieRemove
DBDriver
SSLOCSPDefaultResponder

Соответствующий вывод должен быть:

allow nonxdr writes
io native lib available
ha zookeeper parent znode
min file size
Proxy Status
Proxy FCGI Backend Type
Session DBD Cookie Remove
DB Driver
SSL OCSP Default Responder

Как показано выше, формат имен конфигураций различается (поскольку они исходят от разного программного обеспечения разных организаций). Для первых 4 имен можно разделить их разделителем, например ., - или _. С последними пятью мне тяжело справиться. Если я разделю эти имена только по принципу Camel-Case со словами, начинающимися с заглавной буквы, слова со специальными значениями, такими как FCGI, DBD, DB, могут быть разделены неправильно.

Есть ли хорошая практика, подходящая для решения этой проблемы? Является ли создание словаря вручную единственным способом решения этой проблемы?

КСТАТИ. Эта ситуация возникает только при работе с именами конфигураций в Apache Httpd.


person Chanlen    schedule 31.08.2020    source источник
comment
Для ввода SSLOCSPDefaultResponder мы не можем знать, как разделить первую часть на SSL и OCSP. Вы должны предоставить правила для этого.   -  person Tim Biegeleisen    schedule 31.08.2020
comment
Очень поможет, если есть способ разделить остальные имена. Допустимо, если последний вход не может быть правильно разделен. Я просто упомянул об этом для дальнейшего обсуждения. @Тим   -  person Chanlen    schedule 31.08.2020
comment
Я попытался ответить ниже, что близко к тому, что вы хотите здесь.   -  person Tim Biegeleisen    schedule 31.08.2020


Ответы (1)


Следующий шаблон регулярного выражения кажется близким:

[-._]|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])

Объяснение:

[-._]                     split on -, ., or _
|                         OR
(?<=[a-z])(?=[A-Z])       split when lowercase precedes and uppercase follows
|                         OR
(?<=[A-Z])(?=[A-Z][a-z])  split when uppercase precedes followed by upper-lower

Демо

Единственный тестовый ввод, который не соответствует тому, что вы ожидаете, это:

SSLOCSPDefaultResponder

Мое регулярное выражение дает:

SSLOCSP Default Responder

Причина этого в том, что нет четкого правила, по которому мы знали бы, что между SSL и OCSP должен произойти разрыв. Если вам нужна такая логика, вам может понадобиться словарь известных слов, вокруг которых должны быть дополнительные разбиения.

person Tim Biegeleisen    schedule 31.08.2020
comment
Это довольно близко к ответу, который я ищу! - person Chanlen; 31.08.2020