正则表达式首字母大写超过3个字符的单词,以及连字符和撇号之后

时间:2016-06-14 14:01:57

标签: regex string replace vb6 capitalization

基本上...

我正在尝试对字符串执行自定义大小写;我花了几个小时与Regex战斗无济于事......

要求:

  

我需要大写:

     
      
  1. 如果第一个单词> 3个字符:第一个单词的第一个字母。
  2.   
  3. 如果最后一个单词> 3个字符:最后一个单词的第一个字母。
  4.   
  5. 始终:连字符或撇号后面的第一个字母。
  6.         

    (最终的正则表达式需要在VB6中实现)

Examples:
anne-marie          >  Anne-Marie          // 1st letter of first word + after hyphen
vom schattenreich   >  vom Schattenreich   // 1st letter of last word
will it work-or-not >  Will it Work-Or-Not // 1st letter of outer words + after hyphens
seth o'callaghan    >  Seth O'Callaghan    // 1st letter of outer words + after apostrophe
first and last only >  First and last Only // 1st letter of outer words (excl. middle)
sarah jane o'brien  >  Sarah jane O'Brien  // 1st letter of outer words (excl. middle)

到目前为止我得到了什么:

我把两个正则表达式拼凑在一起,它们之间几乎可以完成我所需要的。然而,我试图将它们合并到一个正则表达式或将其写成单个正则表达式的尝试都失败了。

我的主要困难是我的大写部分仅适用于第一个和最后一个单词,而标点符号特定大写则需要应用于整个字符串。但是我对正则表达式还不够了解,以确保可以用一个表达式。

我的正则表达式:

First letter of First and Last words但不限于超过3个字符的单词,并且不处理完整的字符串标点大小写

^([a-zA-Z]).*\s([a-zA-Z])[a-zA-Z-]+$

First letter of all words, and after punctuation, where more than 3 chars但不排除中间词,或在结尾处理标点符号

(\b[a-zA-Z](?=[a-zA-Z-']{3}))

问题

  

如何将这两个正则表达式结合起来以满足我的要求,或者对它们进行足够的纠正以使它们可以单独使用?或者提供符合要求的不同正则表达式。

参考资料/相关资料来源:

Regex capitalize first letter every word, also after a special character like a dash

First word and first letter of last word of string with Regex

1 个答案:

答案 0 :(得分:1)

这是我的一种正则表达式方法:

Sub ReplaceAndTurnUppercase()

Dim reg As RegExp
Dim res As String

Set reg = New RegExp
With reg
    .Pattern = "^[a-z](?=[a-zA-Z'-]{3})|\b[a-zA-Z](?=[a-zA-Z'-]{3,}$)|['-][a-z]"
    .Global = True
    .MultiLine = True
End With
s = "anne-marie" & vbCrLf & "vom schattenreich" & vbCrLf & "will it work-or-not" & vbCrLf & "seth o'callaghan" & vbCrLf & "first and last only" & vbCrLf & "sarah jane o'brien"
res = s
For Each Match In reg.Execute(s)
    If Len(Match.Value) > 0 Then
        res = Left(res, Match.FirstIndex) & UCase(Match.Value) & Mid(res, Match.FirstIndex + Len(Match.Value) + 1)
    End If
Next Match
Debug.Print res ' Demo part

End Sub

enter image description here

我使用的正则表达式是^[a-z](?=[a-zA-Z'-]{3})|\b[a-z](?=[a-zA-Z'-]{3,}$)|['-][a-z]。由于消耗的所有字符只是我们想要转换为大写或连字符/撇号的字母,我们可以将它们全部大写,而不用去捕捉任何字符。

正则表达式匹配3个替代方案:

  • ^[a-z](?=[a-zA-Z'-]{3}) - 一个字符串的开头(在我的例子中,因为我使用了Multiline=True后面的行)后面跟着一个小写的ASCII字母(消费,以后会大写),后面有3个字符,字母或者'-(未在预测中消费)
  • \b[a-z](?=[a-zA-Z'-]{3,}$) - 一个单词边界\b后跟一个小写的ASCII字母(已消费),后跟三个或更多字母或'-,最后到string(在我的情况下是行)
  • ['-][a-z] - 匹配'-,然后匹配小写字母(字符串中的任意位置)。

res = Left(res, match.FirstIndex) & UCase(match.Value) & Mid(res, match.FirstIndex + Len(match.Value) + 1)行完成工作:它只是将字符串的一部分提取到找到的索引,然后添加修改后的文本,然后附加其余部分。