- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
"(51) 3555-4444" "355544-6ren">
我想写一些格式化巴西电话号码的东西,但我希望它从字符串的末尾开始匹配,而不是开头,所以它会根据以下模式转换输入字符串:
"5135554444" -> "(51) 3555-4444"
"35554444" -> "3555-4444"
"5554444" -> "555-4444"
由于开头部分通常会发生变化,所以我考虑使用 $ 符号构建匹配,以便它从末尾开始,然后向后捕获(我是这么想的),将 then 替换为所需的结尾格式,然后,如果它们是空的,就去掉前面的括号“()”。
这是 C# 代码:
s = "5135554444";
string str = Regex.Replace(s, @"\D", ""); //Get rid of non digits, if any
str = Regex.Replace(str, @"(\d{0,2})(\d{0,4})(\d{1,4})$", "($1) $2-$3");
return Regex.Replace(str, @"^\(\) ", ""); //Get rid of empty () at the beginning
对于 10 位数字,返回值符合预期。但除此之外,它最终会表现出一些奇怪的行为。这些是我的结果:
"5135554444" -> "(51) 3555-4444"
"35554444" -> "(35) 5544-44"
"5554444" -> "(55) 5444-4"
它似乎忽略了末尾的 $ 来进行匹配,除非我用少于 7 位的数字进行测试,它会像这样:
"554444" -> "(55) 444-4"
"54444" -> "(54) 44-4"
"4444" -> "(44) 4-4"
请注意,它保持第三个捕获组的“最小”{n} 次始终从末尾捕获它,但是,前两组从头开始捕获,就好像最后一组是非贪婪的最后,只得到最低限度...奇怪还是我?
现在,如果我更改模式,那么在第三次捕获时我使用 {4} 而不是 {1,4} 结果如下:
str = Regex.Replace(str, @"(\d{0,2})(\d{0,4})(\d{4})$", "($1) $2-$3");
"5135554444" -> "(51) 3555-4444" //As expected
"35554444" -> "(35) 55-4444" //The last four are as expected, but "35" as $1?
"54444" -> "(5) -4444" //Again "4444" in $3, why nothing in $2 and "5" in $1?
我知道这可能是我的一些愚蠢,但如果我想在字符串的末尾捕获,那么所有之前的捕获组都将以相反的顺序被捕获,这不是更合理吗?
我认为在最后一个例子中“54444”会变成“5-4444”……然后它不会……
如何做到这一点?
(我知道也许有更好的方法可以使用不同的方法来完成同样的事情......但我真正好奇的是找出为什么 Regex 的这种特殊行为看起来很奇怪。所以,这个答案问题应该集中在解释为什么最后一次捕获锚定在字符串的末尾,以及为什么其他捕获不是,如本例所示。所以我对实际的电话#格式化问题不是特别感兴趣,但要了解正则表达式语法)...
谢谢...
最佳答案
所以您希望第三部分始终有四位数字,第二部分始终为零到四位数字,第一部分始终为零到两位数,但前提是第二部分包含四位数字?
使用
^(\d{0,2}?)(\d{0,4})(\d{4})$
作为 C# 片段,注释:
resultString = Regex.Replace(subjectString,
@"^ # anchor the search at the start of the string
(\d{0,2}?) # match as few digits as possible, maximum 2
(\d{0,4}) # match up to four digits, as many as possible
(\d{4}) # match exactly four digits
$ # anchor the search at the end of the string",
"($1) $2-$3", RegexOptions.IgnorePatternWhitespace);
通过将?
添加到量词 (??
, *?
, +?
, {a,b}?
) 你让它变懒了,我。 e.告诉它匹配尽可能少的字符,同时仍然允许找到整体匹配项。
如果第一组中没有 ?
,当尝试匹配 123456
时会发生什么情况?
首先,\d{0,2}
匹配 12
。
然后,\d{0,4}
匹配 3456
。
然后,\d{4}
没有任何要匹配的内容,因此正则表达式引擎会回溯,直到再次可以匹配为止。经过四步,\d{4}
可以匹配到3456
。 \d{0,4}
为此贪婪地放弃了它匹配的所有内容。
现在,已找到整体匹配 - 无需尝试更多组合。因此,第一组和第三组将包含部分比赛。
关于C# Regex 用字符串末尾的多个捕获和匹配替换奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429047/
我正在更改链接网址以添加 www.site.com/index.html?s=234&dc=65828 我通过此代码得到的是:site.com/&dc=65828 var target="&dc=65
我在编译过程中收到错误: src/smtp.c:208:1: warning: control reaches end of non-void function [-Wreturn-type] 这是相
这是我的 bootstrap/html 代码: Put email 位置正确,但我希望输入字段的大小延伸到 div 末尾。谁能帮帮我? 最佳答案 只需按百分比指定宽度,如下所示
我正在尝试获取一个像这样的 json 对象: filters = {"filters": myArray}; 并将其附加到 URL 的末尾,使用: this.router.navigate([`/de
这个问题已经有答案了: Remove hash from url (5 个回答) 已关闭 10 年前。 我有一个网站,stepaheadresidents.com ,并且井号 (#) 会自动添加到 u
我有这个代码 $('container a').appendTo('.container'); dzedzdqdqdqzdqdzqdzqdqzdqd Forgot password
为了练习更多 Python 知识,我尝试了 pythonchallenge.com 上的挑战 简而言之,作为第一步,此挑战要求从末尾带有数字的 url 加载 html 页面。该页面包含一行文本,其中有
我对 FS2 很陌生,需要一些有关设计的帮助。我正在尝试设计一个流,它将从底层的 InputStream 中提取 block ,直到结束。这是我尝试过的: import java.io.{File,
我对 FS2 很陌生,需要一些有关设计的帮助。我正在尝试设计一个流,它将从底层的 InputStream 中提取 block ,直到结束。这是我尝试过的: import java.io.{File,
我正在编写一个 ajax 应用程序,并且在 php 脚本中有一个函数: public function expire_user() { $r=array("return"=>'OK');
我正在使用一个QListView,它包装了一个非常简单的列表模型。我想尝试实现类似于某些网页中看到的“无限滚动”的东西。 目前,模型通过最多添加 100 个项目的方法更新(它们取自外部 Web API
运行 cucumber 测试给我以下错误 end of file reached (EOFError) /usr/lib64/ruby/2.0.0/net/protocol.rb:153:in
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我想知道版本命名的具体作用是什么? 喜欢 jquery.js?ver=1.4.4 我的意思是如果我使用像这样的 cdn jquery/1.4.4/jquery.min.js?ver=1.4.4但是另一
" data-fancybox-group="gallery" title="">" alt="" /> 在此代码中 echo $prod['item_image_url'];打印存储在我的表中的图像
我目前使用 Wordpress 作为博客平台,但我想更改为使用 Jekyll 来生成静态页面。在 WordPress 上,我的 URL 使用以下格式: /年/月/日/标题 但我想将其重定向到 /年/月
根据docs这应该是不可能的 Regular expressions cannot be anchored to the beginning or end of a token 尽管如此,它似乎对我有
有没有办法创建 dijit 并将其附加到 div 的末尾?假设我有以下代码: Add Person 我在网上找到了以下代码,但这替换了我的“attendants”div: var personCo
我有这段代码: //execute post (the result will be something like {"result":1,"error":"","id":"4da775
我需要一些函数方面的帮助。 我想编写一个插入链表的函数。但不仅仅是中间,如果必须插入前端或末尾,它也必须起作用。 结构: typedef struct ranklist { i
我是一名优秀的程序员,十分优秀!