我试图为所有Ui\.未遵循Line或甚至只是信件的情况进行grepL
编写正则表达式以查找特定字符串的所有实例而不是其他字符串的正确方法是什么?
使用前瞻
grep "Ui\.(?!L)" *
bash: !L: event not found
grep "Ui\.(?!(Line))" *
nothing
Run Code Online (Sandbox Code Playgroud) 对于正则表达式,搜索的语法是什么,但不包括?有点像:
Haystack:
The quick red fox jumped over the lazy brown dog
Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z
Run Code Online (Sandbox Code Playgroud) 我希望匹配以".htm"结尾的所有字符串,除非它以"foo.htm"结尾.我对正则表达式一般都很体面,但负面的前瞻让我难过.为什么这不起作用?
/(?!foo)\.htm$/i.test("/foo.htm"); // returns true. I want false.
Run Code Online (Sandbox Code Playgroud)
我应该用什么呢?我想我需要一个"负面看后面 "的表达式(如果JavaScript支持这样的东西,我知道它没有).
以下是内容:
Subject:
Security ID: S-1-5-21-3368353891-1012177287-890106238-22451
Account Name: ChamaraKer
Account Domain: JIC
Logon ID: 0x1fffb
Object:
Object Server: Security
Object Type: File
Object Name: D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
Handle ID: 0x11dc
Run Code Online (Sandbox Code Playgroud)
我需要捕捉该行中单词之后的Object Name:单词.这是D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log.我希望有人可以帮助我.
^.*\bObject Name\b.*$ 匹配 - 对象名称
这就是我正在做的(简化示例):
gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt
Run Code Online (Sandbox Code Playgroud)
我试图把bar每一行都放在前面foo.这是错误:
gsed: -e expression #1, char 22: Invalid preceding regular expression
Run Code Online (Sandbox Code Playgroud)
怎么了?
我试图理解负面的前瞻是如何在简单的例子上起作用的.例如,考虑以下正则表达式:
a(?!b)c
Run Code Online (Sandbox Code Playgroud)
我认为负面前瞻符合一个位置.因此,在这种情况下,正则表达式匹配任何严格包含3个字符的字符串,而不是abc.
但这不是真的,正如在这个演示中可以看到的那样.为什么?
我正在尝试制作两个匹配URI的正则表达式.这些URI的格式为:/foo/someVariableData和/foo/someVariableData/bar/someOtherVariableData
我需要两个正则表达式.每个都需要匹配一个而不是另一个.
我最初提出的正则表达式是:
/foo/.+和/foo/.+/bar/.+.
我认为第二个正则表达式很好.它只匹配第二个字符串.然而,第一个正则表达式匹配两者.所以,我开始玩(第一次)负向前瞻.我设计了正则表达式/foo/.+(?!bar)并设置以下代码来测试它
public static void main(String[] args) {
String shouldWork = "/foo/abc123doremi";
String shouldntWork = "/foo/abc123doremi/bar/def456fasola";
String regex = "/foo/.+(?!bar)";
System.out.println("ShouldWork: " + shouldWork.matches(regex));
System.out.println("ShouldntWork: " + shouldntWork.matches(regex));
}
Run Code Online (Sandbox Code Playgroud)
当然,他们两个都决心true.
谁知道我做错了什么?我不需要使用Negative lookahead,我只需要解决问题,我认为负面的预测可能是一种方法.
谢谢,
TL; DR
re.search("(.)(?!.*\1)", text).group()与文本中包含的第一个非重复字符不匹配(它总是在第一个非重复字符处或之前返回一个字符,如果没有非重复字符,则返回字符串结尾之前.我的理解是如果没有匹配,.search()应该返回None.我只是想了解为什么这个正则表达式没有按照预期使用Python re模块工作,而不是任何其他解决问题的方法
完整的背景
问题描述来自https://www.codeeval.com/open_challenges/12/.我已经使用非正则表达式方法解决了这个问题,但重新访问它以扩展我对Python re模块的理解.我认为可行的正则表达式(命名与未命名的反向引用)是:
(?P<letter>.)(?!.*(?P=letter))和(.)(?!.*\1)(在python2和python3中的结果相同)
我的整个程序看起来像这样
import re
import sys
with open(sys.argv[1], 'r') as test_cases:
for test in test_cases:
print(re.search("(?P<letter>.)(?!.*(?P=letter))",
test.strip()
).group()
)
Run Code Online (Sandbox Code Playgroud)
和一些输入/输出对是:
rain | r
teetthing | e
cardiff | c
kangaroo | k
god | g
newtown | e
taxation | x
refurbished | f
substantially | u
Run Code Online (Sandbox Code Playgroud)
根据我在https://docs.python.org/2/library/re.html上所读到的内容:
(.)创建一个匹配任何字符的命名组,并允许以后反向引用它\1.(?!...)是一个负向前瞻,它将匹配限制在...不匹配的情况下..*\1表示任何数字(包括零)字符,后跟(.)前面匹配的任何字符re.search(pattern, string) …我并不十分确定这种类型的正则表达式的正确措辞是什么,但基本上我要做的是匹配任何以"/"开头但后面没有"bob /"的字符串,作为示例.
所以这些匹配:
/tom/
/tim/
/steve
Run Code Online (Sandbox Code Playgroud)
但这些不会
tom
tim
/bob/
Run Code Online (Sandbox Code Playgroud)
我确定答案非常简单,但我很难在任何地方寻找"正则表达式".我确信有一个更好的词,我想要什么会带来好结果,但我不确定它会是什么.
编辑:我已经更改了标题,以指出我正在寻找的正确名称
我无法理解负前瞻正则表达式的更精细细节.在阅读了Regex前瞻,后视和原子组之后,当我找到这个描述时,我认为我对负向前瞻有了很好的总结:
(?!REGEX_1)REGEX_2仅在
REGEX_1不匹配时匹配; 检查后REGEX_1,搜索REGEX_2开始于同一位置.
希望我理解算法,我做了两句话侮辱; 我想找一个没有一个字的句子.特别...
侮辱: 'Yomama很难看.而且,她闻起来像一只湿狗.
要求:
- 测试1:返回一个没有'丑陋'的句子.
- 测试2:返回没有"外观"的句子.
- 测试3:返回没有'气味'的句子.
我将测试单词分配给了$arg,我过去常常(?:(?![A-Z].*?$arg.*?\.))([A-Z].*?\.)执行测试.
(?![A-Z].*?$arg.*?\.) 用测试词拒绝一个句子是一个消极的先行([A-Z].*?\.)匹配至少一个句子.关键部分似乎是在理解正则表达式引擎在处理负前瞻后开始匹配的位置.
预期成果:
- 测试1($ arg ="丑陋"):"而且,她闻起来像一只湿狗."
- 测试2($ arg ="看起来"):"Yomama很难看."
- 测试3($ arg ="气味"):"Yomama很难看."
实际结果:
- 测试1($ arg ="丑陋"):"而且,她闻起来像一只湿狗." (成功)
- 测试2($ arg ="看起来"):"Yomama很难看." (成功)
- 测试3($ arg ="气味"):失败,不匹配
起初我认为测试3失败了,因为([A-Z].*?\.)太贪心并且匹配两个句子; 但是,(?:(?![A-Z].*?$arg.*?\.))([A-Z][^\.]*?\.)也没有用.接下来我想知道python否定前瞻实现是否存在问题,但perl给了我完全相同的结果.
最后我找到了解决方案,我不得不.*?通过使用来拒绝表达式中的句点[^\.]*?; 所以这个正则表达式工作:(?:(?![A-Z][^\.]*?$arg[^\.]*?\.))([A-Z][^\.]*?\.)
但是,我有另一个问题; "Yomama很难看." 它里面没有"气味".所以,如果.*?应该是一个非贪婪的比赛,为什么我不能完成测试3 (?:(?![A-Z].*?$arg.*?\.))([A-Z].*?\.)?
regex ×10
perl ×2
python ×2
expression ×1
grep ×1
java ×1
javascript ×1
linux ×1
search ×1
sed ×1