Regex 将一个单词与其中的数字匹配的正则表达式
我正在使用Regex 将一个单词与其中的数字匹配的正则表达式,regex,perl,Regex,Perl,我正在使用Text::Ngrams确定字符串中的单词组合。但是,我需要保留有数字的单词。我已经确定,$o->{tokenrex}是我需要修改的,但是我不能为它确定合适的正则表达式 原件是qr/([a-zA-Z]+|(\d+(\.\d+)?\d*\.\d+)([eE][-+]?\d+)/但我想我需要更多的东西: qr/([a-zA-Z]+|(?<=\w)(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?(?=\w)|(\d+(\.\d+)?|\d*\.\d+)([e
Text::Ngrams
确定字符串中的单词组合。但是,我需要保留有数字的单词。我已经确定,$o->{tokenrex}
是我需要修改的,但是我不能为它确定合适的正则表达式
原件是qr/([a-zA-Z]+|(\d+(\.\d+)?\d*\.\d+)([eE][-+]?\d+)/代码>但我想我需要更多的东西:
qr/([a-zA-Z]+|(?<=\w)(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?(?=\w)|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/;
qr/([a-zA-Z]+|(?看来你有几件事需要解决。如果我理解你的意思,将单词拆分成不同的标记就很容易了:只使用非捕获组。如果你不想在foo
周围创建新的捕获组,请使用(?:foo)
;使用(foo)
如果你这样做了
无论如何,我觉得你想要的模式是这样的:
p{L}*(?:\d*\.)?\d+(?:[eE][-+]?\d+)?(?:(?<=p{L}(?:\d*\.)?\d+(?:[eE][-+]?\d+)?)p{L}+)?
p{L}*(?:\d*\)?\d+(?:[eE][-+]?\d+)(?:(?这个(?试试这个:
qr/(\b[a-zA-Z]([a-zA-Z\d]+[a-zA-Z])?\b |(\d+)(\.\d+)\d*\.\d+)([eE][-+]?\d+)/
但是,请注意,此正则表达式(和原始正则表达式)将匹配单词“边缘”上的数字。所有人都将此方法变得过于复杂。原始正则表达式只匹配由字母或数字(整数、浮点,包括指数表示法)组成的单词
如果您需要匹配由字母和数字组成的单词,则其正则表达式为[a-zA-Z\d]+
。根据模块文档,您还需要指定要跳过的内容,并匹配[^a-zA-Z\d]+
$self->{tokenrex} = qr/([a-z\d]+)/i;
$self->{skiprex} = qr/([^a-z\d]+)/i;
如果您需要识别模块文档在其示例中所示的数字,请告诉我,我很乐意为您重新添加。根据您的描述,这听起来不像您需要的。学会使用并热爱允许您使用空白(空格、制表符、换行符)的x
regex修饰符在正则表达式中formatting@Eric斯特罗姆:我完全打算这么做;我希望在解释它的功能之前让它工作:)这正是问题所在。如果你能看到它的功能,它就更容易工作了!当然,它不会总是只有3个字符;这就是为什么我试图使它更通用。在我们的例子中,至少假设你的例子中的E是一个字母,而不是一个指数。顺便说一句,上面的正则表达式导致perl抱怨“未实现可变长度lookbehind”@gms8994-啊,这是不幸的。它仍然可行,只会更长。试试这个:p{L}+(?:\d*\)?\d+(?:[eE][-+]?\d+)?p{L}+|(?应该做同样的事情。这只是mob解决方案的一个改进。它将前两个备选方案合并为一个。
qr/(?<=A)1(?=X)/
qr/([a-zA-Z]+|[a-zA-Z][a-zA-Z0-9]+[a-zA-Z]|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/
$self->{tokenrex} = qr/([a-z\d]+)/i;
$self->{skiprex} = qr/([^a-z\d]+)/i;