基本上…

我正在尝试对一个字符串执行自定义大写;我花了几个小时与regex斗争,但没有成功…

要求:

I need to capitalise:

If first word >3 chars: First letter of the first word.

If last word >3 chars: First letter of the last word.

Always: First letter following a hyphen or apostrophe.

(The final regex needs to be implementable into 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)

到目前为止我得到的:

我把两个正则表达式混在一起,它们几乎可以完成我需要的任务。然而,我尝试将它们合并到一个regex中,或者将其作为一个regex来编写,但都失败了。

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

我的正则表达式:

第一个和最后一个单词的第一个字母,但不限于超过3个字符的单词,并且不处理全字符串标点大写。

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

所有单词的第一个字母,以及标点符号之后,其中超过3个字符但不排除中间单词,或在结尾处处理标点符号。

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

问题

How I can combine these two regex's to meet my requirements, or correct them enough that they can be used separately? Alternatively provide a different regex that meets the requirements.

参考/相关来源材料:

regex将每个单词的第一个字母大写,也可以在特殊字符(如破折号)之后

带regex的字符串最后一个单词的第一个单词和第一个字母

以下是我的一个regex方法:

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

我使用的regex是^[a-z](?=[a-zA-Z'-]{3})|\b[a-z](?=[a-zA-Z'-]{3,}$)|['-][a-z]。由于使用的所有字符都是我们想要变为大写或连字符/撇号的字母,因此我们可以将它们全部变为大写,而不必捕获任何字符。

regex匹配3个选项:

^[a-z](?=[a-zA-Z'-]{3})—字符串的开头(在我的例子中,是我使用Multiline=True以来的行),后跟一个小写的ASCII字母(消耗掉,以后再大写),后面有3个字符,字母或'或-(不消耗,在lookahead中)

\b[a-z](?=[a-zA-Z'-]{3,}$)—一个单词边界\b,后面跟一个小写的ASCII字母(已使用),后面跟3个或更多的字母,或者'或-,直到字符串的结尾(在我的例子中是line)。

['-][a-z]—与'或-匹配,然后是小写字母(字符串中的任意位置)。

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

谢谢你的快速反应,非常接近!不幸的是,我只需要匹配超过3个字符的第一个和最后一个单词。见regex101.com/r/mx4wh6/3

那么,你能更新输入文本的样本吗?我只和你发的邮件核对过。

当然,请稍等一下:)//完成

是不是不能和别人一起处理呢?(请原谅我对瑞吉丝的了解不足)

看起来我过分夸大了regex的复杂性:)

php首字母大写正则,关于字符串:正则表达式首字母大写超过3个字符的单词,并在连字符和撇号之后...相关推荐

  1. php随机生成大写字母,PHP生成随机字符串包括大小写字母

    PHP生成随机字符串包括大小写字母,这里介绍两种方法: 第一种:利用字符串函数操作 /** *@blog */ function createRandomStr($length){ $str = '0 ...

  2. python判断字母数字_Python判断字符串是否为字母或者数字(浮点数)的多种方法

    str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() ...

  3. php 是否包含 大写,PHP检查字符串中是否包含大写字符

    PHP检查字符串中是否包含大写字符,也就是判断指定字符串中是否全为小写.我们可以通过for循环以及strlen().ord()函数来实现. 下面我们就结合具体的代码示例,给大家介绍PHP检查字符串中是 ...

  4. 分享一个.NET(C#)按指定字母个数截断英文字符串的方法–提供枚举选项,可保留完整单词...

    分享一个.NET(C#)按字母个数截断英文字符串的方法,该方法提供枚举选项.枚举选项包括:可保留完整单词,允许最后一个单词超过最大长度限制,字符串最后跟省略号以及不采取任何操作等,具体示例实现代码如下 ...

  5. C语言中删除字符串中一个字母,C程序删除字符串中除字母之外的所有字符

    C程序删除字符串中除字母之外的所有字符 在此示例中,您将学习从用户输入的字符串中删除除字母之外的所有字符. 要理解此示例,您应该了解以下C语言编程主题: 删除字符串中除字母之外的字符#include ...

  6. Java 计算字母个数_统计字符串中每个字母的个数

    最近整理之前自己学习Java时的一些代码笔记,可能都是一些比较基础的Java知识,在这里只是给需要的人参考一下. 统计一个字符串中的每个字母的个数 现有字符串:dludsstytrwtrjahtksd ...

  7. python字符串按首字母排序,Python按字母順序排序字符串,首先是小寫

    I want to sort a given array of strings alphabetically using python, but lowercase words should appe ...

  8. mysql 提取字符串首字母_SQL获取字段字符串中文首字母

    有中文有英文,获取中文首字母信息. SELECT person_name_cn , ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(person_name_cn USING gb ...

  9. C#正则查找字符串是否包含字母

    string gg = "789546";//如果count大于0表示有字母 int count=System.Text.RegularExpressions.Regex.Matc ...

最新文章

  1. php网站实施说明书_PHP中$_SERVER使用说明
  2. java xca碗组口径,公路车常见杂音检查清单和解决方法(图文)
  3. [转载] Python: struct 模块之字节对齐问题
  4. 百度地图API-自定义图标覆盖物
  5. Dubbo/ Spring Cloud 分布式事务管理 LCN方式
  6. 基于 display 和 javaScript 封装一个页面布局小插件
  7. Java中判断素数的五种方法
  8. Apizza-响应json数据上设置浮动注释
  9. Apollo学习笔记(一):canbus模块与车辆底盘之间的CAN数据传输过程
  10. 阿帕奇服务器搭建网站,使用Apache搭建Web网站服务器
  11. 确定性的丧失——20世纪新启蒙运动的来龙去脉
  12. 高阶整车域控制器的详细设计方案
  13. 提示缺少unicode打开乱码_教你如何破译乱码
  14. python中空格怎么打_191012 python3关于空格打印、赋值、+=符号的小坑
  15. 使用IP地址连接网络打印机
  16. python IMAP4命令详解
  17. 今日头条是如何做推广和运营的?
  18. AS SSD软件查看信息说明
  19. 【HTML作业】HTML设计--电影网站,影视网站
  20. aul 语法约定和命令行方式

热门文章

  1. python读取图片到数组
  2. Java版CRC8和CRC16工具类
  3. 数字签名和数字信封的比较
  4. Field Status Variant
  5. convertToRinex批处理
  6. 基于C开发一款简洁实用的Mp3播放器
  7. 确认过眼神,你是HPIPS的锦鲤
  8. 鸿蒙电视rom,华为鸿蒙os2.0系统安装包-华为鸿蒙os2.0系统刷机包v2.0.1-速游网
  9. Docker在windows环境 使用阿里云镜像 pull 报错 x509: certificate signed by unknown authority
  10. Python中文文本分析时遇到的编码问题小结