我如何摆脱这个“(“使用正则表达式? 我沿着一个正则表达式移动,我撞到了一个路障,我好像无法走动。我试图用ReGEX去掉中间的一行文字,有2个,但我知道如何在线的末尾找到一个。中间的那个我可以破解。

我如何摆脱这个“(“使用正则表达式? 我沿着一个正则表达式移动,我撞到了一个路障,我好像无法走动。我试图用ReGEX去掉中间的一行文字,有2个,但我知道如何在线的末尾找到一个。中间的那个我可以破解。,regex,perl,Regex,Perl,下面是我正在搜索的文件的一个更完整的片段 ide1:0.present = "TRUE" ide1:0.clientDevice = "TRUE" ide1:0.deviceType = "cdrom-raw" ide1:0.startConnected = "FALSE" floppy0.startConnected = "FALSE" floppy0.clientDevice = "TRUE" ethernet0.present = "TRUE" ethernet0.virtualDev =

下面是我正在搜索的文件的一个更完整的片段

ide1:0.present = "TRUE"
ide1:0.clientDevice = "TRUE"
ide1:0.deviceType = "cdrom-raw"
ide1:0.startConnected = "FALSE"
floppy0.startConnected = "FALSE"
floppy0.clientDevice = "TRUE"
ethernet0.present = "TRUE"
ethernet0.virtualDev = "e1000"
ethernet0.networkName = "solignis.local"
ethernet0.addressType = "generated"
guestOSAltName = "Ubuntu Linux (64-bit)"
guestOS = "ubuntulinux"
uuid.location = "56 4d e8 67 57 18 67 04-c8 68 14 eb b3 c7 be bf"
uuid.bios = "56 4d e8 67 57 18 67 04-c8 68 14 eb b3 c7 be bf"
vc.uuid = "52 c7 14 5c a0 eb f4 cc-b3 69 e1 6d ad d8 1a e7"
下面是我正在处理的整个foreach循环的一个示例

my @virtual_machines;
foreach my $vm (keys %virtual_machines) {
    push @virtual_machines, $vm;
}
foreach my $vm (@virtual_machines) {
    my $vmx_file = $ssh1->capture("cat $virtual_machines{$vm}{VMX}");

    if ($vmx_file =~ m/^\bguestOSAltName\b\s+\S\s+\W(?<GUEST_OS> .+[^")])\W/xm) {
        $virtual_machines{$vm}{"OS"} = "$+{GUEST_OS}";
    } else {
        $virtual_machines{$vm}{"OS"} = "N/A";
    }
    if ($vmx_file =~ m/^\bguestOSAltName\b\s\S\s.+(?<ARCH> \d{2}\W\bbit\b)/xm) {
        $virtual_machines{$vm}{"Architecture"} = "$+{ARCH}";
    } else {
        $virtual_machines{$vm}{"Architecture"} = "N/A";
    }
}
我正在使用ARCH的代码块部分是完美无瑕的,所以我真正需要的是在搜索运行到时删除64位部分(如果它存在),并让它删除前面的空白

我想要的是把上面的散列转储变成这个

$VAR1 = {
      'NS02' => {
                  'ID' => '144',
                  'Version' => '7',
                  'OS' => 'Ubuntu Linux',
                  'VMX' => '/vmfs/volumes/datastore2/NS02/NS02.vmx',
                  'Architecture' => '64-bit'
                },

减去64位部分后的结果是一样的。

类似的方法应该可以工作:

$match =~ s/^(.*?)\((.*?)$/$1$2/;

像这样的方法应该会奏效:

$match =~ s/^(.*?)\((.*?)$/$1$2/;

您可以将正则表达式简化为/^guestOSAltName\s+=\s+?。++/m。其作用是:

^强制匹配从行首开始 guestOSAltName是一个字符串文字。 \s+匹配1个或多个空白字符。 ?.+匹配从空格后到行尾的所有文本,捕获组并将其命名为GUEST_OS。如果行中可能有注释,您可能希望将.+更改为[^]+。 组中的字母是文字引号。 末尾的m将启用多行匹配。 代码:


请参见此处:

您可以将正则表达式简化为/^guestOSAltName\s+=\s+?。++/m。其作用是:

^强制匹配从行首开始 guestOSAltName是一个字符串文字。 \s+匹配1个或多个空白字符。 ?.+匹配从空格后到行尾的所有文本,捕获组并将其命名为GUEST_OS。如果行中可能有注释,您可能希望将.+更改为[^]+。 组中的字母是文字引号。 末尾的m将启用多行匹配。 代码:

请参见此处:

在您的柜台后面使用?代表

正则表达式为/^guestOSAltName[^]+?.+?\s*[\]+.*$/:

在您的柜台后面使用?代表

正则表达式为/^guestOSAltName[^]+?.+?\s*[\]+.*$/:


因此,您希望匹配guestOSAltName之后的字符串内容,直到第一个(如果存在)为止,而不包括第一个(如果存在)

然后将代码示例的第一行替换为

if ($vmx_file =~ m/^guestOSAltName\s+=\s+"(?<GUEST_OS>[^"()]+)/xm) {
如果在可能的左括号前总是有一个空白字符,那么可以使用

if ($vmx_file =~ m/^guestOSAltName\s+=\s+"(?<GUEST_OS>[^"()]+)[ "]/xm) {

因此,如果存在尾随空格,则不需要去掉尾随空格。

因此,您希望匹配guestOSAltName之后的字符串内容,直到并不包括第一个(如果存在)

然后将代码示例的第一行替换为

if ($vmx_file =~ m/^guestOSAltName\s+=\s+"(?<GUEST_OS>[^"()]+)/xm) {
如果在可能的左括号前总是有一个空白字符,那么可以使用

if ($vmx_file =~ m/^guestOSAltName\s+=\s+"(?<GUEST_OS>[^"()]+)[ "]/xm) {
因此,如果存在尾随空格,您不需要去掉它。

通常认为。*的功能太强大了。有两条建议

更明确地说明你在寻找什么

    my $text = '( something ) ( something else) ' ;

    $text =~ /
      \(
      ( [\s\w]+ )
      \)
        /x ;

    print $1 ;
使用非贪婪匹配

    my $text = '( something ) ( something else) ' ;

    $text =~ /
      \(
      ( .*? )   # non greedy match
      \)
        /x ;

    print $1 ;
一般观察-如果您使用/x选项,相关的regexp更容易阅读,因为它允许空格和注释。

通常会发现。*功能太强大了。两个建议

更明确地说明你在寻找什么

    my $text = '( something ) ( something else) ' ;

    $text =~ /
      \(
      ( [\s\w]+ )
      \)
        /x ;

    print $1 ;
使用非贪婪匹配

    my $text = '( something ) ( something else) ' ;

    $text =~ /
      \(
      ( .*? )   # non greedy match
      \)
        /x ;

    print $1 ;


一般观察-如果你使用/x选项,相关的正则表达式更容易阅读,因为这允许空格和注释。

你能提供输入模式吗。类似于Ubuntu Linux 64位。它会帮助你指的是源文件中获取信息的行吗?不,是你试图与正则表达式匹配的文本。我添加了编辑了我试图匹配的文本。你能提供输入模式吗。类似于Ubuntu Linux 64位。它会帮助你指的是源文件中获取信息的行吗?不,是你试图与正则表达式匹配的文本。我添加了我试图匹配的文本。这不起作用,我上面写的方式就是这样我正在从VMware服务器读取VMX文件中的一个字符对一个字符。包括=和空格。我尝试用你的表达式代替我的表达式,得到了相同的结果。@Soligins要么提供更多代码编辑问题,要么查看它是否工作,并找出为什么它工作,而你的不工作。是的,我会添加更多,我一直在保留它之所以精益,是因为我不想用大块代码激怒任何人。@solignis这是一件好事!我的意思是,给出你在我的正则表达式中使用的失败的代码。这是行不通的,我上面编写它的方式是如何在我从VMware服务器读取的VMX文件中逐个字符地编写。包括=和WhitePace、 我试着用你的表达式代替我的表达式,我得到了同样的结果。@Soligins要么给出更多的代码来编辑问题,要么看看它是否起作用,然后找出为什么它起作用而你的不起作用。是的,我会补充更多,我一直保持精简,因为我不想惹麻烦

告诉任何有大块代码的人。@solignis这是件好事!我的意思是给出你在我的正则表达式中使用的失败的代码。不符合给出的示例,我还发现我表达式的来宾操作系统部分需要贪婪,如果我像你建议的那样使其非贪婪,它将在第一个空格处停止。我正在尝试去除空格和行的64位部分。它也可能是32位。我已将正则表达式更改为/^guestOSAltName[^]+.+?\s\.*$/。它对Ubuntu Linux有效,但当我在Microsoft Windows Server 2003上尝试它时,标准版的if语句跳转到else语句,该语句打印为N/A,所以它几乎在那里。更新:/^guestOSAltName[^]+.+?\s*[\]+.*$/不,根据给出的示例,我还发现表达式的来宾操作系统部分需要贪婪,如果我按照您的建议将其设置为非贪婪,它将在第一个空格处停止。我正在尝试去除空格和行的64位部分。它也可能是32位。我已将正则表达式更改为/^guestOSAltName[^]+.+?\s\.*$/。它对Ubuntu Linux有效,但当我在Microsoft Windows Server 2003上尝试它时,标准版的if语句跳转到else语句,该语句打印为N/A,所以它几乎在那里。更新:/^guestOSAltName[^]+.+?\s*[\]+.*$/我很累地告诉它从搜索中排除,但出于某种原因,它不喜欢第二个,因为它只会排除一个。我将尝试您的代码。不完全是,我正在尝试匹配引号之间的所有内容,不包括和之间的文本,这是脚本后面的内容。然后我还需要去掉搜索文本周围的引号。你的意思是,在像文本1文本2文本3这样的文本中,你想得到文本1文本3作为匹配结果吗?这在单个正则表达式中是不可能的。不,我所有的搜索模式都是单词和空格,然后它们要么以64\32位结束,要么什么都不结束,只是作为结束行。然后我的模式应该可以工作。不过,您可能希望从结果中去掉尾随空格。如果输入字符串中的a前面总是有空格,也可以在正则表达式中执行此操作。我很累地告诉它从搜索中排除,但出于某种原因,它不喜欢第二个,因为它只会排除一个。我将尝试您的代码。不完全是,我正在尝试匹配引号之间的所有内容,不包括和之间的文本,这是脚本后面的内容。然后我还需要去掉搜索文本周围的引号。你的意思是,在像文本1文本2文本3这样的文本中,你想得到文本1文本3作为匹配结果吗?这在单个正则表达式中是不可能的。不,我所有的搜索模式都是单词和空格,然后它们要么以64\32位结束,要么什么都不结束,只是作为结束行。然后我的模式应该可以工作。不过,您可能希望从结果中去掉尾随空格。如果输入字符串中a前面总是有空格,也可以在正则表达式中执行此操作。我使用you sample绑定,但当我使其更具体时,它停止得太快,因此我使用的不是Microsoft Windows Server 2003,而是Microsoft。我使用you sample绑定,但当我使其更具体时,它停止得太快,因此,我选择了微软,而不是微软的WindowsServer2003。