我之前问了他的问题,但没有一个回答解决了这个问题。以下是完整的问题:
给出一个UNIX管道,它将创建一个文件file1,其中包含file2中的所有单词,每行一个单词。这个单词是一串字母,前面和后面是非字母。
我尝试了下面给出的每一个例子,但是在使用它时我得到“语法错误”。
有谁知道我怎么解决这个问题?
由于
答案 0 :(得分:1)
如果你的正则表达式支持它,你可以使用lookarounds:
(?<![a-zA-Z])[a-zA-Z]+(?![a-zA-Z])
(?<!..)
:前面没有
(?!..)
:未跟随
如果不是这种情况,您可以使用捕获组和否定字符类:
(^|[^a-zA-Z])([a-zA-Z]+)($|[^a-zA-Z])
结果在第2组
^|[^a-zA-Z]
:字符串的开头或非字母字符(除字母外的所有字符)
$
:字符串
或与一个捕获组和两个非捕获组相同:
(?:^|[^a-zA-Z])([a-zA-Z]+)(?:$|[^a-zA-Z])
(结果在第1组)
答案 1 :(得分:0)
当你的目标是实际找到单词时,最自然的方式是
\b[A-Za-z]+\b
然而,这假设正常的单词边界,如空格,某些标点符号或终端位置。您的要求表明您想要计算“1example2”中的“示例”。 在这种情况下,我建议使用
[A-Za-z]+
请注意,您实际上并不需要查找字母表之前或之后的内容。这已经捕获了所有字母和仅字母。贪婪的要求(+)确保捕获不会遗漏任何东西。
Lookarounds等不应该是必要的,因为你想要捕获的内容和你想要排除的内容是彼此完全相反的。
下面的方法与Casimir相似,不同之处在于我们在终端排除了单词(由于您的原始描述,我们明确地试图捕获这些单词)。
<强> Lookarounds 强>
(?<=[^A-Za-z])[A-Za-z]+(?=[^A-Za-z])
测试here。请注意,这使用了否定的正面外观,而不是负面外观,因为它们最终会匹配字符串终端(对于正则表达式引擎而言,与我一样,非字母表)。
如果看起来不适合您,则需要捕获群组。 搜索如下,然后选择第一个捕获的组。
[^A-Za-z]([A-Za-z]+)[^A-Za-z]
在谈论正则表达式时,您需要非常具体和准确地满足您的要求。
答案 2 :(得分:0)
为了兼容unicode,您可以使用:
(?:^|\PL)\pL+(?:\PL|$)
\pL
代表任何语言的任何字母
\PL
与\pL