web-dev-qa-db-ja.com

正規表現は、ダッシュのような特殊文字の後にも、すべての単語の最初の文字を大文字にします

私はこの#(\s|^)([a-z0-9-_]+)#iを使用して、すべてのWordのすべての最初の文字を大文字にします。ダッシュ(-)のような特別なマークの後にある場合は、文字も大文字にしたいです。

今、それは示しています:

This Is A Test For-stackoverflow

そして、私はこれが欲しい:

This Is A Test For-Stackoverflow

提案/サンプルはありますか?

私はプロではないので、理解しやすいようにしてください。

24
Simmer

簡単な解決策は、 単語の境界 を使用することです。

#\b[a-z0-9-_]+#i

あるいは、ほんの数文字で一致させることもできます。

#([\s\-_]|^)([a-z0-9-_]+)#i
20
Kobi

単語の境界に対して+1。ここに、同等のJavascriptソリューションがあります。これも所有格を説明します。

var re = /(\b[a-z](?!\s))/g;
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();});
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"
19
NotNedLudd

実際には、次のように大文字以外の最初の文字と一致するだけで完全な文字列と一致する必要はありません。

'~\b([a-z])~'
7
anubhava

これは作ります

R.E.A.C De Boeremeakers

から

r.e.a.c de boeremeakers

(?<=\A|[ .])(?<up>[a-z])(?=[a-z. ])

を使用して

    Dim matches As MatchCollection = Regex.Matches(inputText, "(?<=\A|[ .])(?<up>[a-z])(?=[a-z. ])")
    Dim outputText As New StringBuilder
    If matches(0).Index > 0 Then outputText.Append(inputText.Substring(0, matches(0).Index))
    index = matches(0).Index + matches(0).Length
    For Each Match As Match In matches
        Try
            outputText.Append(UCase(Match.Value))
            outputText.Append(inputText.Substring(Match.Index + 1, Match.NextMatch.Index - Match.Index - 1))
        Catch ex As Exception
            outputText.Append(inputText.Substring(Match.Index + 1, inputText.Length - Match.Index - 1))
        End Try
    Next
0
Sedecimdies

ここに私のPythonソリューション

>>> import re
>>> the_string = 'this is a test for stack-overflow'
>>> re.sub(r'(((?<=\s)|^|-)[a-z])', lambda x: x.group().upper(), the_string)
'This Is A Test For Stack-Overflow'

ここで「ポジティブルックビハインド」について読む: https://www.regular-expressions.info/lookaround.html

0
nmz787

#([\s-]|^)([a-z0-9-_]+)#iを試してください-(\s|^)は空白文字(\s)または行の先頭(^)に一致します。 \s[\s-]に変更すると、空白文字またはダッシュに一致します。

0
Shadikka