我正在编写一个正则表达式来提取目录和文件名。我在一个正则表达式测试器中测试它似乎在那里工作,但是当我在我的C ++程序中运行它时它会崩溃。
regex re("^(.*)(\\/|\\\)(.*\\.flt)$");
我正在使用Visual Studio 2010 SP1进行编译。当我运行代码时,它在上面给出的行上断开。为什么呢?
编辑:我得到的例外是
Microsoft C ++异常:内存位置的std :: tr1 :: regex_error 0x0042eb4c。
它在regex.cpp第19行打破
答案 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 ++替换转义序列后,正则表达式构造函数将看到此构造
[/\\\\]
表示“前锋或后退”。