2015-06-03 49 views
3

我试图在正则表达式中变得更好。我正在使用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有一个首字母大写。我可以看到有关匹配大写或小写但不能转换为大写的各种示例。

看来我需要做某种“功能”处理。我需要通过1美元的东西,然后将其分成两部分......第一个字母和所有其他字母......将第一个字符转换为大写字母......然后一起粉碎并返回结果。

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

所以,如果有人可以指向我的阅读材料,我将不胜感激。

+1

你见过这个帖子:http://stackoverflow.com/questions/1159343/convert-a-char-to-upper-case-using-regular-expressions-editpad-pro –

+1

我似乎没有正则表达式的工作(大写)。您需要处理您的拍摄组。你在用什么语言? –

+1

你的语言是什么? – Kasramvd

回答

0

所以最终的答案是,你不能使用正则表达式来变换...这不是它的工作。由于其他人的意见,我能够调整我的方法,并且仍然完成了这个自学成果的目标。

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

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

所以后来用记事本+ +我然后用这个代替:

\ U $ 1 $ 2组的动物,如$ 3遗传学较差的结果。

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

谢谢大家帮助新手。

+0

请选择您认为最完整,最有帮助的答案,并将其标记为已接受的答案。它鼓励人们在未来发布有用的答案! –

1

我认为它可以非常简单地根据你使用,你可以杉杉遍历值的列表,找到你的对手,然后把你的字符串中的组和第一场比赛使用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

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

  • 匹配项目
  • 显示匹配

,但你想要做的是:

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

正则表达式不会对匹配执行任何“处理”,它只是首先查找匹配的语法。

大多数语言都有字符串处理,举例来说,如果你有你的变量$1和如上$2匹配,你会想要做的线沿线的东西:

$1 = upper(substring($1, 0, 1)) + substring($1, 1)

假设upper()函数,如果你的语言的串联uppercasing函数,并substring()返回一个子字符串(零索引)。

+0

MATCHING正则表达式的澄清点很好。是的,我模糊了线条。 – GPGVM

2

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

然而,这在Perl中是可能的,但仅仅是因为Perl在正则表达式替换完成后处理文本,它不是正则表达式本身的一个特性。以下是如果在命令行中运行执行的情况下转型很短的Perl程序(没有正则表达式):

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

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

同样的转义序列工作,regexs太:

#!/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]); 
} 
?> 
+0

很好的答案。我很久以前就忘记了我多年前自学的PERL,但我确实记得 - 有一种方法可以做到这一点! –

相关问题