Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 如何在Perl中从逗号分隔的值中提取值?_Regex_Perl - Fatal编程技术网

Regex 如何在Perl中从逗号分隔的值中提取值?

Regex 如何在Perl中从逗号分隔的值中提取值?,regex,perl,Regex,Perl,我有一个日志文件,其中包含来自不同服务器的统计信息。我仅使用正则表达式将统计信息与此日志文件分离。 我试图从正在运行的进程中捕获CPU使用情况。对于SunOS,我有以下输出: process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java process,26190,user1,20,0,1236m,43m,6436,S,0.0,1.1,0:00.00,java, 这里,如果我们用逗号(,)分隔,CPU%位于第11个字段。此字段

我有一个日志文件,其中包含来自不同服务器的统计信息。我仅使用正则表达式将统计信息与此日志文件分离。 我试图从正在运行的进程中捕获CPU使用情况。对于SunOS,我有以下输出:

process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java
process,26190,user1,20,0,1236m,43m,6436,S,0.0,1.1,0:00.00,java,
这里,如果我们用逗号(,)分隔,CPU%位于第11个字段。此字段具有唯一的%符号,我可以使用下面的正则表达式获取此值:

regex => q/^process,(?:.*?),((?:\d+)\.(?:\d+))%,java$/,
对于linux系统,我有以下输出:

process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java
process,26190,user1,20,0,1236m,43m,6436,S,0.0,1.1,0:00.00,java,
这里的CPU使用率在第10列,但没有%符号,我看不出这个字段有什么独特之处


我应该使用什么正则表达式模式来获取此值?

如果行已经用逗号分隔,您可以在字符串上使用并选择正确的字段

e、 g


您的数据结构具有不同的分隔符,所以不要使用正则表达式,而只需使用拆分并通过索引(或切片)获取项目。比较容易

$output="process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java";
@s = split /,/,$output;
print "$s[10]\n";

对于linux,只需获取
$s[9]

我对linux一无所知,但如果代码看起来太幼稚,请忽略它:)

/^process.*(用于处理逗号分隔的值。如果你在问这个问题,你不应该试图自己处理。该模块经过了极大的优化,你自己无法做得更好


提取正确的位置后,可以去掉%符号(如果有)。

是否也需要识别该行,或者只提取值,即是否需要一些不相关的行?如果不需要,则答案为
/^(?:[^,]+,){9}([^,]+)/'


这将从一些逗号分隔的列表中提取第十个字段

谢谢,但我必须定义一个正则表达式以获得所需的值,就像我对SunOS进程所做的那样。如果我使用split,我必须更改我的完整代码:(.在我看来,你在使用正则表达式,从行中选择字段。你不能将其改为使用split吗?你在所有地方都使用正则表达式吗?我正在尝试只使用正则表达式获取其他值,我已经完成了大部分工作。因此,我不想更改完整的代码。我在你的编程生涯你会发现自己对大部分代码都做了相当多的修改。咬紧牙关。永远不要附加任何代码。同意@brian。如果你的代码已经使用了正则表达式,那么它将比建议的更复杂。为什么要使它更复杂?与普通的
拆分/,/
相比,这个模块有什么优势?它是极端的ely fast,这就是为什么我说“极度优化”。阅读它的文档。它也能正确处理CSV,但拆分不正确。人们总是推荐该模块,因为它正确且非常快速。人们不断推荐它应该是一个大的、闪烁的标志。:)当你是必须这样做的人并且你还没有处理大问题时,你不应该关注微观优化。当其他人已经这样做了,你应该使用它。另外,为了强调brian的另一点,“它也正确地处理CSV,哪一个拆分不正确”。这可能比优化还有更大的好处。为什么要投否决票?有人能解释一下吗?如果你觉得代码看起来太幼稚,你可以忽略它,或者你可以提供更好的版本,但请解释:)@布莱恩:你的编辑完全改变了我的问题。这并不像从csv中提取值那么简单。这个问题很清楚。+1来反驳DownVote有什么不同?一个是第11个字段,另一个是第10个字段。没有什么比这更复杂的了,除非你没有告诉我们什么。你专注于正则表达式解决方案,它给出了XY问题:我已经编辑了我的问题,希望现在更清楚。强制性:
有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题了。-comp.lang.emacs中的Jamie Zawinski。
谢谢gianthare:我也必须识别这行代码,我正在使用^process和java$。然后将它更改为
/^process,(?:[^,]+,){8}([^,]+)(?:[^,]+,)*java$/
hi gianthare:我已经尝试过了,但是仍然没有得到所需的输出。请给我任何建议。我忘记了在“java”后面加一个逗号,在CPU字段
/^process,(?:[^,]+,){8}([^,]+,(?:[^,]+,)*java,$/'
后面加一个逗号。现在应该可以工作了