正则表达式 - 匹配句子中每个单词的所有字母

mah*_*eng 4 regex lookahead lookbehind

我几乎得到了答案,但我错过了一些东西,我希望有人可以帮助我.

我需要一个正则表达式,它将匹配句子中每个单词的第一个字母.然后我需要用正确数量的星号替换匹配的字母.例如,如果我有以下句子:

There is an enormous apple tree in my backyard.
Run Code Online (Sandbox Code Playgroud)

我需要得到这个结果:

T**** i* a* e******* a**** t*** i* m* b*******.
Run Code Online (Sandbox Code Playgroud)

我设法想出一个几乎可以做到的表达式:

(?<=(\b[A-Za-z]))([a-z]+)
Run Code Online (Sandbox Code Playgroud)

使用上面的例句,该表达式给了我:

T* i* a* e* a* t* i* m* b*.
Run Code Online (Sandbox Code Playgroud)

如何获得正确数量的星号?

谢谢.

Kob*_*obi 9

试试这个:

\B[a-z]
Run Code Online (Sandbox Code Playgroud)

\B是相反的\b- 它匹配没有单词边界的地方 - 当我们看到一个字母在另一个字母之后.

你的正则表达式正在替换单词的整个尾部 - [a-z]+用一个星号.你应该逐个替换它们.如果你想要它可以工作,你应该匹配一个字母,但检查后面有一个字(这有点无意义,因为你也可以检查一个字母(?<=[A-Za-z])[a-z]):

(?<=\b[A-Za-z]+)[a-z]
Run Code Online (Sandbox Code Playgroud)

(请注意,最后一个正则表达式具有可变长度的lookbehind,这在大多数正则表达式中都没有实现)

  • 这里最短的正则表达式可能是“\B\w”,但是“\w”添加了大写字母和下划线。 (2认同)
  • `(?&lt;=\b[A-Za-z]+)` 除了 .NET 和 JGSoft 之外的任何风格都不起作用。你第一次就做对了。 (2认同)