CamelCase 单词的单独元素

Joh*_*hen 5 text-processing

有没有办法在文本中的“内部”单词边界处拆分 CamelCase 单词?

例如,给定字符串:

IamHelloTest forYou PickTest; 
Run Code Online (Sandbox Code Playgroud)

作为输入,我想产生作为输出:

Iam
Hello
Test
for
You
Pick
Test
Run Code Online (Sandbox Code Playgroud)

更新:既然问题有很多有用的答案,我将如何继续包括以下案例?

输入:

IamTestECHO TEST PickFoo BARFull;
Run Code Online (Sandbox Code Playgroud)

期望的输出:

I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
Run Code Online (Sandbox Code Playgroud)

更新:我将如何继续包含下划线?

输入:

IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;
Run Code Online (Sandbox Code Playgroud)

期望的输出:

I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 7

如果您的grep实现支持-o(并且不是与-o空字符串匹配的正则表达式窒息的 ast-open 实现):

grep -o '[[:upper:]]*[[:lower:]]*'
Run Code Online (Sandbox Code Playgroud)

  • 很好,GNU grep / pcre 版本将是 `grep -Po '\p{Lu}*\p{Ll}*'`。但这不会将 `I` 与 ​​`IAmTheMountain` 中的 `Am` 分开(诚然,这可能正是 OP 想要的)。 (2认同)

JJo*_*oao 2

为了处理您的第二个示例,建议采用更“基于规则”的方法。\n考虑以下 Perl 脚本 ( camelcaseproc):

\n\n
#!/usr/bin/perl -CSDA -p\n\ns{  \\W+                                     # break on non-word\n |  _                                       # break on "_"\n |  (?<=\\p{Ll})(?=\\p{Lu})                   # ...aB... \xe2\x86\x92 ...a-B...\n |  (?<=\\p{Lu})(?=\\p{Lu}\\p{Ll})             # ..ABCd.. \xe2\x86\x92 ...AB-Cd.\n |  (?<=I)(?=am)                            # exceptions rules\n }{-}xg                                     # \n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 第 1 行:使用 Unicode(处理重音、西里尔字母)
  • \n
  • 第 2 行:用“\\n”替换非字母
  • \n
  • 第 3,4,5 行:break-intraWord 规则(由左上下文、右上下文定义)
  • \n
  • 第 5 行:“Iam”的例外规则
  • \n
  • 第 5 行:x选项可以在正则表达式中添加注释
  • \n
\n\n

通常chmod +x camelcaseproc我们可以将其用作:

\n\n
$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"\nI-am-Test-ECHO-TEST-Pick-Foo-BAR-Full\n\n$ camelcaseproc input-file\n\n$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc\n
Run Code Online (Sandbox Code Playgroud)\n