给出这种形式的任意字符串
“和x ='o'reilly'和y ='o'reilly'和z ='abc'”
任何人都可以建议一种直接的方式来代替''for the'中包含在o'reilly部分的字符吗? (它当然可以是任何带有嵌入式撇号的序列。)
我无法控制字符串的一般模式。它可能是任何包含'zzz'bbb'形式的部分,甚至可能是'aaa'bbb'ccc',其中内部撇号需要被替换,而不是“外部”撇号。
我尝试过正则表达式,其余的都是。我很难过,但我得解决它!
TIA。
答案 0 :(得分:0)
如果你愿意假设嵌入式撇号总是在两边都有一个字母数字字符(而不是空格),那么你可以这样做:
(\w)'(\w)
然后替换为:
\1\2
这将具有删除字母数字之间的撇号的效果。看看这个RegExr:http://regexr.com?376k9
示例:
'hello there i am a representative from 'o'reilly' publishing and i am '2'3' years old'
变为:
'hello there i am a representative from 'oreilly' publishing and i am '23' years old'
答案 1 :(得分:0)
好吧,我可能会用这个正则表达式...因为你真正需要的是找到撇号,前后字母不是白色空格......应该很容易。
否则,你可以运行一个string.indexof(“'”),检查之前和之后的位置是不是空格......然后BOOM ......把它吹出水面......
string test = "aoeu'aou ";
string bad_test = "aoeu ' aoeu";
var index = test.IndexOf("'");
if (!test[index-1].Equals(' ') && !test[index+1].Equals(' '))
Console.Out.WriteLine("Boom at index "+ index);
else
Console.Out.WriteLine("seems we have some spaces");
index = bad_test.IndexOf("'");
if (! bad_test[index - 1].Equals(' ') && !bad_test[index + 1].Equals(' '))
Console.Out.WriteLine("Boom at index " + index);
else
Console.Out.WriteLine("seems we have some spaces");
这将输出:
指数4的繁荣 好像我们有一些空格
答案 2 :(得分:0)
以下是您的工作示例:
class Program
{
static void Main(string[] args)
{
var input = "and x = 'o'reilly' and y = 'o'reilly' and z = 'abc' ";
var output = input
.Select((c, i) => new { Character = c, Index = i })
.Where(o =>
{
if (o.Character != Convert.ToChar("'")) { return false; }
var i = o.Index;
var charBefore = (i == 0) ? false :
char.IsLetter(input[i - 1]);
var charAfter = (i == input.Length - 1) ? false :
char.IsLetter(input[i + 1]);
return charBefore && charAfter;
})
.ToList();
foreach (var item in output)
{
input = input.Remove(item.Index, 1);
input = input.Insert(item.Index, "\"");
}
Console.WriteLine(input);
if (Debugger.IsAttached) { Console.ReadKey(); }
}
}
输出:
and x = 'o"reilly' and y = 'o"reilly' and z = 'abc'
基本上,它只是获取一个匿名对象列表,它为每个字符提供一个索引,过滤到只有'
的前缀并以字母为后缀,然后通过索引修改输入这些对象的结果。
答案 3 :(得分:0)
你在找这样的吗?
var splittedString = " and x = 'o'reilly' and y = 'o'reilly' and z = 'abc' ".Split(new char[] {' '},
StringSplitOptions
.RemoveEmptyEntries);
List<string> listStrings = splittedString.Select(s => s.Trim('\'').Replace('\'', '"')).ToList();
var finalResult = "";
var prevMatchIsEqualToSign = false;
foreach (var s in listStrings)
{
if (prevMatchIsEqualToSign)
{
finalResult += "'" + s + "' ";
}
else if (s == "=")
{
finalResult += "= ";
prevMatchIsEqualToSign = true;
continue;
}
else
{
finalResult += s +" ";
}
prevMatchIsEqualToSign = false;
}
Console.WriteLine(finalResult);