为什么这个正则表达式导致程序崩溃?

时间:2015-06-11 16:17:39

标签: c++ regex visual-studio-2010

我正在编写一个正则表达式来提取目录和文件名。我在一个正则表达式测试器中测试它似乎在那里工作,但是当我在我的C ++程序中运行它时它会崩溃。

regex re("^(.*)(\\/|\\\)(.*\\.flt)$");

我正在使用Visual Studio 2010 SP1进行编译。当我运行代码时,它在上面给出的行上断开。为什么呢?

编辑:我得到的例外是

  

Microsoft C ++异常:内存位置的std :: tr1 :: regex_error   0x0042eb4c。

它在regex.cpp第19行打破

1 个答案:

答案 0 :(得分:3)

问题是你正确地逃避了反斜杠:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.CellRendererPane;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TitleAdder
{
    public static void main(String[] args)
    {
        addTitle("yS2aQ.png", "output.png", 
            "<html><font size=4>This <font color=#FF0000><b>Text</b></font><br>" +
            "with line breaks<br>" +
            "will be the title</font></html>");
    }

    private static void addTitle(
        String inputFileName, String outputFileName, String title)
    {
        try (InputStream in = new FileInputStream(inputFileName);
             OutputStream out = new FileOutputStream(outputFileName))
        {
            BufferedImage sourceImage = ImageIO.read(in);
            BufferedImage targetImage = 
                addTitle(sourceImage, title);
            ImageIO.write(targetImage, "png", out);

            // Show the image, for testing
            show(targetImage);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private static BufferedImage addTitle(
        BufferedImage sourceImage, String title)
    {
        JLabel label = new JLabel(title);
        label.setBackground(Color.WHITE);
        label.setForeground(Color.BLACK);
        label.setOpaque(true);
        int titleHeight = label.getPreferredSize().height;
        int height = sourceImage.getHeight() + titleHeight;
        BufferedImage targetImage = new BufferedImage(
            sourceImage.getWidth(), height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = targetImage.createGraphics();
        SwingUtilities.paintComponent(g, label, new CellRendererPane(), 
            0, 0, sourceImage.getWidth(), titleHeight);
        g.drawImage(sourceImage, 0, titleHeight, null);
        g.dispose();

        return targetImage;
    }

    private static void show(final BufferedImage image)
    {
        SwingUtilities.invokeLater(new Runnable()
        {

            @Override
            public void run()
            {
                JFrame f = new JFrame();
                f.getContentPane().add(new JLabel(new ImageIcon(image)));
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}

这应该意味着“前进或后退”将由编译器首先进行转换。以反斜杠开头的每对字符将由基于转义序列的单个字符替换。

(\\/|\\\) 是表示\\的有效转义序列。但是,\不是有效的转义序列,因此它将被\)替换。因此,正则表达式构造函数将“看到”这个:

)

这会转义右括号,导致语法错误。

字符类为您的情况提供了更好的语法:代替括号“OR”组,使用单个

(\/|\)

在C ++替换转义序列后,正则表达式构造函数将看到此构造

[/\\\\]

表示“前锋或后退”。