Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将一个单词与其中的数字匹配的正则表达式_Regex_Perl - Fatal编程技术网

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;