2015-06-03 50 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,但我確實記得 - 有一種方法可以做到這一點! –

相關問題