【问题标题】:Regular Expression - Match all but first letter in each word in sentence正则表达式 - 匹配句子中每个单词中除首字母之外的所有字母
【发布时间】:2011-01-25 05:40:53
【问题描述】:

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

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

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 lookahead


【解决方案1】:

试试这个:

\B[a-z]

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

您的正则表达式正在用单个星号替换单词的整个尾部 - [a-z]+。您应该一一更换。如果你想让它工作,你应该匹配一个字母,但是 check is 后面有一个单词(这有点没有意义,因为你不妨检查一个字母(?&lt;=[A-Za-z])[a-z]):

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

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

【讨论】:

  • 这里最短的正则表达式大概是\B\w,但是\w加了大写字母和下划线。
  • (?&lt;=\b[A-Za-z]+) 除了 .NET 和 JGSoft 之外,不会在任何风格中工作。你第一次就做对了。
  • @Alan - 好点。我已经添加了一个警告。不管怎样,我确实说这毫无意义:)
  • 并且(取决于正则表达式的风格以及您是否计划匹配除 a 和 z 之间的非重音字母之外的其他字符)您可能希望使用 \p{L}[^\W\d_] 而不是 [a-z] .
  • @NathanArthur - 这是一个很好的问题......潜在的问题更加困难:什么是单词?上面的模式假设一个单词是由字母数字字符组成的,这是错误的。事实上,我不相信我可以用一个简单的模式可靠地解决这个问题——边缘情况太多了。不过,至于您的问题:在.Net 中,您可以在上面的模式中添加一个撇号:(?&lt;=\b[A-Za-z']+)[a-z]。在其他口味上,我认为(?&lt;=\B|\b')[a-z] 可以工作。无论哪种方式,都需要一些思考。
【解决方案2】:

不妨试试这个:

(\w{1})\w*

【讨论】:

    【解决方案3】:

    这是一个老问题。添加一个答案,因为其他人似乎没有完全或清楚地解决这个问题。处理这个问题的最简单的正则表达式是/(\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>

    【讨论】:

      【解决方案4】:

      你可以试试这个

      \B\w
      

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

      从这个==Hello==World==变成==H****==W****==

      【讨论】:

        猜你喜欢
        • 2020-01-15
        • 2019-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        相关资源
        最近更新 更多