将正则表达式匹配值的第一个字母强制为大写

时间:2015-06-03 14:09:30

标签: regex

我正在努力改善正则表达式。我正在使用regex101.com。我有一个有两个捕获组的正则表达式。然后我使用替换将我捕获的值合并到另一个位置。

例如,我有一个值列表:

fat dogs 
thin cats
skinny cows
purple salamanders
etc...

并将其捕获为两个变量:

^([^\s]+)\s+([^\s;]+)?.*

然后我用$ 1和$ 2替换成新句子。例如:

$1 animals like $2 are a result of poor genetics.

(显然这是一个愚蠢的例子)

这有效,我得到了我的句子但是我很难过试图迫使1美元得到一个大写的第一个字母。我可以在MATCHING大写或小写但不转换为大写的情况下看到各种各样的例子。

我似乎需要做某种“功能”处理。我需要将$ 1传递给一些东西,然后将其分成两部分......第一个字母和所有其他字母......将第一个字母转换为大写字母......然后将它们一起粉碎并返回结果。

添加到该错误检查...虽然$ 1不太可能有数值,但我们仍应进行某种安全检查。

所以,如果有人能指出我的阅读材料,我会很感激。

4 个答案:

答案 0 :(得分:2)

我认为根据您选择的语言,它可以非常简单。您可以在值列表上循环并查找匹配项,然后使用capitalize方法将字符串放在字符串中,以便首次匹配:

for val in my_list:
    m = match(^([^\s]+)\s+([^\s;]+)?.*,val)
    print  "%sanimals like %s are a result of poor genetics."%(m.group(1).capitalize(), m.group(1))

但是如果你想用regex全部点缀它是不可能的,因为你需要修改你的字符串,这通常不是一个正则表达式正则表达式的正则表达式。

答案 1 :(得分:2)

非常简单,正则表达式只能替换原始字符串中的内容。 F中没有资金fat dogs,因此您无法获得Fat dogs作为输出。

然而,这在Perl中是可能的,但仅仅因为Perl在正则表达式替换完成后处理文本,它不是正则表达式本身的特征。以下是一个简短的Perl程序(sans regex),如果从命令行运行,则执行大小写转换:

#!/usr/bin/perl -w
use strict;

print "fat dogs\n";   # fat dogs
print "\ufat dogs\n"; # Fat dogs
print "\Ufat dogs\n"; # FAT DOGS

相同的转义序列也适用于正则表达式:

#!/usr/bin/perl -w
use strict;

my $animal = "fat dogs";
$animal =~ s/(\w+) (\w+)/\u$1 \U$2/;
print $animal;  # Fat DOGS

让我重复一遍,Perl是这样做的,而不是正则表达式。

根据您的真实世界示例,您可能不必更改字母的大小写。如果您输入的是Fat dogs,那么您将获得所需的结果。否则,您必须自己处理$1

在PHP中,您可以在返回替换字符串之前使用preg_replace_callback()来处理整个匹配,包括捕获的组。这是一个类似的PHP程序:

<?php
$animal = "fat dogs";
print(preg_replace_callback('/(\w+) (\w+)/', 'my_callback', $animal));  // Fat DOGS

function my_callback($match) {
  return ucfirst($match[1]) . ' ' . strtoupper($match[2]);
}
?>

答案 2 :(得分:1)

正则表达式只匹配那里的表达式。你在做什么本质上是:

  • 匹配项目
  • 显示匹配

但你想要做的是:

  • 匹配项目
  • 修改匹配
  • 显示已修改的匹配项

正则表达式不做任何处理&#39;在比赛中,它只是首先找到匹配的语法。

大多数语言都有字符串处理,例如,如果您在变量eval()$1中匹配,如上所述,您可能需要执行以下操作:

$2

如果你的语言是串联的大写函数,则假设$1 = upper(substring($1, 0, 1)) + substring($1, 1)函数,upper()返回一个子字符串(零索引)。

答案 3 :(得分:0)

所以最后答案是你可以使用正则表达式来改变......那不是它的工作。感谢其他人的投入,我能够调整自己的方法,并且仍然完成了这种自我学术任务的目标。

首先从OP中你会记得我有一个列表,我从该列表中捕获两个单词到正则表达式变量。好吧,我修改了正则表达式捕获以获得三个捕获组。例如:

^(\S)(\S+)\s+_(\S)?.*
//would turn fat dogs into
//$1 = f, $2 = at, $3 = dogs

然后使用Notepad ++然后我将其替换为:

\ u $ 1 2美元2美元的动物是由于遗传性差导致的。

通过这种方式,我能够将第一个字母转换为大写字母..但正如其他人指出的那样,这不是正则表达式进行转换而是另一个进程。 (在这种情况下,记事本++,但可能是你的c#,perl等)。

感谢大家帮助新手。