我几个小时以来一直坚持这个愚蠢问题。我知道这似乎很愚蠢,但我真的不知道我错过了什么。任何帮助将不胜感激。
这是我的问题:
var objReg = /touch/g;
var str = "abc touch def touch";
var arr = objReg.exec(str);
这里我希望数组arr
包含2个元素,但它只包含第1个元素,即使我确保放置g
修饰符。
任何人都可以指导我在这里做什么吗?
调试:如下图所示,该数组只有1个元素(index = 0)
答案 0 :(得分:6)
var cgImage = ImageView1.Image.CGImage; // Your UIImage with a CGImage backing image
var bytesPerPixel = 4;
var bitsPerComponent = 8;
var bytesPerUInt32 = sizeof(UInt32) / sizeof(byte);
var width = cgImage.Width;
var height = cgImage.Height;
var bytesPerRow = bytesPerPixel * cgImage.Width;
var numOfBytes = cgImage.Height * cgImage.Width * bytesPerUInt32;
IntPtr pixelPtr = IntPtr.Zero;
try
{
pixelPtr = Marshal.AllocHGlobal((int)numOfBytes);
using (var colorSpace = CGColorSpace.CreateDeviceRGB())
{
CGImage newCGImage;
using (var context = new CGBitmapContext(pixelPtr, width, height, bitsPerComponent, bytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedLast))
{
context.DrawImage(new CGRect(0, 0, width, height), cgImage);
unsafe
{
var currentPixel = (byte*)pixelPtr.ToPointer();
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// RGBA8888 pixel format
if (*currentPixel == byte.MinValue)
{
*currentPixel = byte.MaxValue;
*(currentPixel + 1) = byte.MaxValue;
*(currentPixel + 2) = byte.MaxValue;
}
else
{
*currentPixel = byte.MinValue;
*(currentPixel + 1) = byte.MinValue;
*(currentPixel + 2) = byte.MinValue;
*(currentPixel + 3) = byte.MinValue;
}
currentPixel += 4;
}
}
}
newCGImage = context.ToImage();
}
var uiimage = new UIImage(newCGImage);
imageView2.Image = uiimage; // Do something with your new UIImage
}
}
finally
{
if (pixelPtr != IntPtr.Zero)
Marshal.FreeHGlobal(pixelPtr);
}
修饰符会使正则表达式对象保持状态。它在最后一场比赛后跟踪索引。如果你想使用g
,你可以使用一个循环,它会自动开始在适当的位置搜索字符串。
.exec()
答案 1 :(得分:5)
要获得所需效果,您需要与String.prototype.match()
:
var arr = str.match(objReg);
对于.exec()
标志,RegExp g
函数的行为方式不同。标志 使用.exec()
执行某事但不执行.match()
所做的事情。