这里的一个单词是一串字母,前面和后面是非字母

时间:2014-01-16 02:23:16

标签: regex unix

我之前问了他的问题,但没有一个回答解决了这个问题。以下是完整的问题:

给出一个UNIX管道,它将创建一个文件file1,其中包含file2中的所有单词,每行一个单词。这个单词是一串字母,前面和后面是非字母。

我尝试了下面给出的每一个例子,但是在使用它时我得到“语法错误”。

有谁知道我怎么解决这个问题?

由于

3 个答案:

答案 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

相反