我有一个字符串,其中包含一个连续的数字块,然后是一个连续的字符块.我需要将它们分成两部分(一个整数部分和一个字符串).
我尝试过使用String.split("\\D", 1),但它正在吞噬第一个角色.我检查了所有的String API,但没有找到合适的方法.
做这件事有什么方法吗?
正则表达式:(?=(\d+))\w+\1
字符串:456x56
嗨,
我没有得到这个概念,这个正则表达式如何匹配字符串"456x56"中的"56x56".
但是正则表达式匹配56x56.
从URL的字符向量开始.我们的目标是与公司的唯一名称最终,只意味着一列"test","example"并"sample"在下面的例子.
urls <- c("http://grand.test.com/", "https://example.com/",
"http://.big.time.sample.com/")
Run Code Online (Sandbox Code Playgroud)
删除".com"可能跟随它的任何内容并保留第一部分:
urls <- sapply(strsplit(urls, split="(?<=.)(?=\\.com)", perl=T), "[", 1)
urls
# [1] "http://grand.test" "https://example" "http://.big.time.sample"
Run Code Online (Sandbox Code Playgroud)
我的下一步是使用链式调用删除http://和https://部分gsub():
urls <- gsub("^http://", "", gsub("^https://", "", urls))
urls
# [1] "grand.test" "example" ".big.time.sample"
Run Code Online (Sandbox Code Playgroud)
但这是我需要帮助的地方.如何在第一个和第三个网址字符串中处理公司名称之前的多个句点(点)?例如,下面的调用返回第二个字符串的NA,因为该"example"字符串没有剩余句点.或者,如果我只保留第一部分,我会丢失公司名称.
urls <- sapply(strsplit(urls, split = "\\."), "[", 2)
urls
# [1] "test" NA "big"
urls <- sapply(strsplit(urls, split = "\\."), "[", 1)
urls
# [1] "grand" "example" ""
Run Code Online (Sandbox Code Playgroud)
也许是一个 …
我试图在一个正则表达式中包含两个正向前瞻.这是我正在努力解决的问题.
(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20}
Run Code Online (Sandbox Code Playgroud)
这就是我想要匹配的:
当我只使用一个前瞻时,它可以工作,但是一旦我添加另一个,它就会中断.两个前瞻的正确语法是什么?
我正在努力使这个正则表达式模式完全正确,如果有人有更好的选择,我对正则表达式之外的其他选项持开放态度.
情况:我基本上是要针对C#中的文本列解析T-SQL"in"子句.所以,我需要采用这样的字符串值:
"'don''t', 'do', 'anything', 'stupid'"
并将其解释为值列表(稍后我会处理双引号):
"don''t""do""anything""stupid"我有一个适用于大多数情况的正则表达式,但是我很难将它概括为可以接受任何字符或我的组中的双引号单引号: (?:')([a-z0-9\s(?:'(?='))]+)(?:')[,\w]*
我对正则表达式很有经验,但很少(如果有的话)发现需要环顾四周(因此降低了对我的正则表达式经验的评估).
所以,换句话说,我想要一串逗号分隔的值,每个值都用单引号括起来,但可以包含加倍的单引号,并输出每个这样的值.
编辑 这是我当前正则表达式的一个非工作示例(我的问题是我需要处理我的分组中的所有字符,当我遇到单引号后没有第二个单引号时停止):
"'don''t', 'do?', 'anything!', '#stupid$'"
我正在尝试这个挑战:
我想匹配所有不包含ABBA模式的字符串.
比赛:
aesthophysiology
amphimictical
baruria
calomorphic
Run Code Online (Sandbox Code Playgroud)
不匹配
anallagmatic
bassarisk
chorioallantois
coccomyces
abba
Run Code Online (Sandbox Code Playgroud)
首先,我有一个正则表达式来确定ABBA模式.
(\w)(\w)\2\1
Run Code Online (Sandbox Code Playgroud)
接下来我想匹配不包含该模式的字符串:
^((?!(\w)(\w)\2\1).)*$
Run Code Online (Sandbox Code Playgroud)
然而,这符合一切.
如果我通过为负前瞻指定文字来简化这一点:
^((?!agm).)*$
Run Code Online (Sandbox Code Playgroud)
正则表达式与字符串"anallagmatic"不匹配,这是期望的行为.
因此看起来问题在于我在负向前瞻中使用捕获组和反向引用.
regex backreference regex-negation capturing-group regex-lookarounds
我需要一个正则表达式,它只会选择那些不以 .png 或 .css 等特定扩展名结尾的 URL 字符串。
我测试了以下内容:
1)这个使用负回顾:
(?<!\.png|\.css)$
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/tW4fO5/1
2)另一个使用负前瞻:
^(?!.*[.]png|.*[.]css$).*$
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/qZ7vA4/1
两者似乎都工作正常,但据说 #1(负向后视)在 436 步(见链接)中处理,而 #2(负向后视)据说在 173 步中处理。
所以我的问题是:这是什么意思?会不会影响演出?
最后,这两个正则表达式在功能上真的是等价的吗?
编辑:解决方案摘要
总结一下,考虑到要通过正则表达式排除的字符串结尾的完整列表(一个典型的场景是 Web 服务器设置,其中静态资源由 apache 提供,而动态资源由不同的引擎提供 - 在我的情况下: php-fpm)。
PCRE 正则表达式有两种可能的选择:
1)负面回顾
$(?<!\.(?:ico|gif|jpg|png|css|rss|xml|htm|pdf|zip|txt|ttf)$|(?:js|gz)$|(?:html|woff)$)
https://regex101.com/r/eU9fI6/1
请注意,我使用了几个 OR ed 后视,因为负后视需要固定宽度的模式(即:您不能混合不同长度的模式)。这使得这个选项的编写稍微复杂一些。此外,在我看来,这降低了它的性能。
2)负前瞻
^(?!.*[.](?:js|ico|gif|jpg|png|css|rss|xml|htm|html|pdf|zip|gz|txt|ttf|woff)$).*$
https://regex101.com/r/dP7uD9/1
前瞻比后视略快。这是 100 万次迭代的测试结果:
后视时间 = 18.469825983047 秒
前瞻时间 = 14.316685199738 秒
如果我没有可变长度模式的问题,我会选择后视,因为它看起来更紧凑。反正哪一个都好。最后,我向前看:
<LocationMatch "^(?!.*[.](?:js|ico|gif|jpg|png|css|rss|xml|htm|html|pdf|zip|gz|txt|ttf|woff)$).*$">
SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://www/srv/www/gioplet/web/public/index.php"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud) regex negative-lookbehind negative-lookahead regex-lookarounds
码:
Match match = Regex.Match("abc", "(?(x)bx)");
Console.WriteLine("Success: {0}", match.Success);
Console.WriteLine("Value: \"{0}\"", match.Value);
Console.WriteLine("Index: {0}", match.Index);
Run Code Online (Sandbox Code Playgroud)
输出:
Success: True
Value: ""
Index: 1
Run Code Online (Sandbox Code Playgroud)
似乎没有"else"表达式的条件组将改为从"if"表达式的第一个字符创建一个前瞻,并将其用作"else".在这种情况下,它将像正则表达式一样运行(?(x)bx|(?=b))
****在这里发生了什么?这是故意的吗?它似乎没有记录.
编辑:已在corefx存储库中创建了一个问题:https://github.com/dotnet/corefx/issues/26787
我正在尝试编写一些正则表达式,以使我可以对捕获组进行隐式查找,以便可以从电子邮件中提取可能的引用。我需要知道如何从某个角度看向第一个空白。如果找到一个数字,我不希望提取引用。
我已经达到如下所示。我有2个捕获组-'PreRef'和'Ref'。如果'PreRef'包含数字,我不希望找到'Ref'匹配项。到目前为止,我只检查冒号前面的字符是否为数字。
(?<PreRef>\S+)(?<![\d]):(?<Ref>\d{5})
Run Code Online (Sandbox Code Playgroud)
此处的“参考”匹配为12345:
This is a reference:12345
Run Code Online (Sandbox Code Playgroud)
但是不是这里(“引用”一词中有5):
This is not a ref5rence:12345
Run Code Online (Sandbox Code Playgroud) 我想匹配该单词,gay除非它是该单词的一部分megayacht。我知道我可以使用负前瞻和负后瞻来排除gayacht或megay从匹配中,例如
(?<!me)gay
Run Code Online (Sandbox Code Playgroud)
和
gay(?!acht)
Run Code Online (Sandbox Code Playgroud)
但使用
(?<!me)gay(?!acht)
Run Code Online (Sandbox Code Playgroud)
仍然会从比赛中排除megay和gayacht,这不是我想要的。我找不到同时需要两者的方法。