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

问题描述 投票:0回答:4

我在这里几乎得到了答案,但我遗漏了一些东西,我希望这里有人可以帮助我。

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

There is an enormous apple tree in my backyard.

我需要得到这个结果:

T**** i* a* e******* a**** t*** i* m* b*******.

我想出了一个几乎可以做到这一点的表达方式:

(?<=(\b[A-Za-z]))([a-z]+)

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

T* i* a* e* a* t* i* m* b*.

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

谢谢你。

regex lookbehind regex-lookarounds
4个回答
17
投票

试试这个:

\B[a-z]

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

您的正则表达式正在用一个星号替换单词的整个尾部 -

[a-z]+
。您应该将它们一一替换。如果你想让它工作,你应该匹配一个字母,但是检查后面有一个单词(这有点毫无意义,因为你不妨检查一个字母
(?<=[A-Za-z])[a-z]
):

(?<=\b[A-Za-z]+)[a-z]

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


2
投票

你可以试试这个

\B\w

这将替换除每个单词的第一个字母之外的所有字符

从此

==Hello==World==
进入
==H****==W****==


0
投票

尝试这个可能:

(\w{1})\w*

0
投票

这是一个老问题了。添加答案,因为其他人似乎没有完全或清楚地解决这个问题。处理这个问题的最简单的正则表达式是

/(\B[a-z])/g
。这将添加“g”作为全局标志,因此将在整个字符串中重复单个字符搜索。

string = "There is an enormous apple tree in my backyard."
answer = string.replace(/\B[a-z]/g, "*");

string = "There is an enormous apple tree in my backyard."
$("#stringDiv").text(string);

answer = string.replace(/\B[a-z]/g, "*");
$("#answerDiv").text(answer);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="stringDiv"></div>
<div id="answerDiv"></div>

© www.soinside.com 2019 - 2024. All rights reserved.