【问题标题】:Regex of every first char and any capital in the word单词中每个第一个字符和任何大写字母的正则表达式
【发布时间】:2016-09-20 09:50:27
【问题描述】:

我在 REGEX 尝试构建一个可以检索单词的第一个字母和该单词的任何其他大写字母以及每个首字母(包括同一个单词中的任何大写字母)的问题时遇到了麻烦

"WelcomeBack to NorthAmerica a great place to be" = WBTNAAGPTB
"WelcomeBackAgain to NorthAmerica it's nice here" = WBATNAINH
"Welcome to the NFL, RedSkins-Dolphins play today" = WTTNFLRSDPT

尝试了这个 juus 来获得前 2 场比赛:

/([A-Z])|\b([a-zA-Z])/g

欢迎任何帮助,谢谢

【问题讨论】:

标签: javascript regex


【解决方案1】:

您需要一个匹配所有大写字母和出现在字符串开头或空格之后的小写字母的正则表达式:

var re = /[A-Z]+|(?:^|\s)([a-z])/g; 
var strs = ["WelcomeBack to NorthAmerica a great place to be", "WelcomeBackAgain to NorthAmerica it's nice here", "Welcome to the NFL, RedSkins-Dolphins play today"];
for (var s of strs) {
  var res = "";
  while((m = re.exec(s)) !== null) {
    if (m[1]) {
       res += m[1].toUpperCase();
    } else {
      res += m[0];
    }
  }
  console.log(res);
}

这里,[A-Z]+|(^|\s)([a-z]) 匹配多次出现的:

  • [A-Z]+ - 1 个或多个大写 ASCII 字母
  • | - 或
  • (?:^|\s) - 字符串开头 (^) 或空格 (\s)
  • ([a-z]) - 第 1 组:一个小写 ASCII 字母。

【讨论】:

  • 通过捕获大写字符可以稍微简化代码,这意味着可以删除if 语句,因为循环会将所有捕获的内容收集到一个字符串中(@987654330 @),然后将整个结果大写。这将从while 循环中剪掉4 行,因此for 循环的大小几乎是原来的一半。
  • 谢谢@wiktor,它就像一个魅力。很好的解释!
【解决方案2】:

试试这个:

let s = "WelcomeBack to NorthAmerica a great place to be";
s = s.match(/([A-Z])|(^|\s)(\w)/g);    // -> ["W","B"," t", " N"...]
s = s.join('');                        // -> 'WB t N...'
s = s.replace(/\s/g, '');              // -> 'WBtN...'
return s.toUpperCase();                // -> 'WBT ...'

/(?:([A-Z])|\b(\w))/g 匹配每个大写字母 ([A-Z])| 在字符串 ^ 或空格 \s 开头之后的每个字母 (\w)

(由于某种原因,我无法让空白不被捕获,因此 replace 步骤。当然有更好的技巧,但这是我发现的最易读的。)

【讨论】:

  • 如果就这么简单,那么整个代码可以是单行代码。在发布我的答案之前,我已经尝试过这种方法。第二个示例字符串应返回WBATNAINHyour code returns WBATNAISNH
  • 您不需要将捕获组包装在另一个组中以使 OR 工作。没有它也一样。
  • 由于某种原因,我无法让空白不被捕获 - 原因是 JS 正则表达式引擎不支持lookbehinds :(
  • 多么奇怪.. 我的意思是你不能捕捉其他东西,对吧?为什么空白需要后视?
  • @HumanCatfood 这不是“空白”,真的。您可以很好地不使用(?:) 捕获内容,但是regex.exect 将返回在索引零处匹配的everything。这包括非捕获组。然后将捕获的组放置在返回数组的其余索引中。 exclude 东西被匹配的唯一方法是使用零长度匹配——那些将不会被匹配,因此不会在索引零处返回。回溯是零长度匹配,但是 JS 不支持它。您可以通过反转字符串和正则表达式来模拟它,然后使用前瞻。
【解决方案3】:

您可以将正则表达式用作:/\b[a-z]|[A-Z]+/g;

<html>
   <head>
      <title>JavaScript String match() Method</title>
   </head>
   <body>
      <script type="text/javascript">
         var str = "WelcomeBack to NorthAmerica a great place to be";
         var re = /\b[a-z]|[A-Z]+/g;
         var found = str.match( re );
         found.forEach(function(item, index) {
            found[index] = item.toUpperCase();
        });
          document.write(found.join('')); 
      </script>
      
   </body>
</html>

【讨论】:

  • 试试WelcomeBackAgain to NorthAmerica it's nice here - 经过一些编辑 - 你会得到一个更接近我或 HumanCatford 的解决方案。
【解决方案4】:

你可以试试这个,它也会处理空格

str = str.match(/([A-Z])|(^|\s)(\w)/g);
str = str.join('');
str=str.replace(/ /g,'');
return str.toUpperCase();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多