我需要在+
的间隔内验证字符串是否包含single quotes
。
示例:string str = "'Name + R405'"
。
但是,这个字符串可能会出现多个具有这些值的范围。
示例:string str = "'Name + R405' + '(Name)'"
。在这种情况下,第二个+
在我的代码中有一个特定的功能(它没有单引号)。
换句话说,我只需要识别单引号内的+
。如果还有其他方法,请为我解释。
更新
在单引号内(我需要的文本在哪里)可能包含其他单引号。因此,我不能简单地做检查来观察一对单引号的开头和结尾。
更新2:
我有一个可能有点复杂的问题。我的系统具有接受某些字符串的函数,并且这些字符串根据某个参数进行操作:
单引号中的文字不会被更改/操纵;
要将一个文本与另一个文本分开,请使用+;
我的字符串必须接受任何字符(这是一个问题,我知道)。
例如:"'Name' + On + 'Sector'"
。像这样的字符串只有这些方法操纵的部分"On"
。但是,我有"'Name + Code' + On + 'Sector'"
或"'Name'+Code '+ On +'Sector'"
等字符串。 "Name + Code"
/ "Name'+Code"
不会被操纵。因此,这些方法与此类文本“混淆”,并且使用文本部分内的+
和single quotes
不应更改。但我无法改变方法,必须在调用方法之前在字符串中执行处理。
答案 0 :(得分:1)
你可以通过迭代字符并跟踪你看过的单引号来做到这一点。
public static bool HasPlusBetweenSingleQuotes(string str)
{
bool inSingleQuotes = false;
foreach (char c in str)
{
if (c == '\'')
{
inSingleQuotes = !inSingleQuotes;
}
else if (c == '+' && inSingleQuotes)
{
return true;
}
}
return false;
}
如果您需要单引号内的加号的索引,您可以执行以下操作。
public static IEnumerable<int> PlusBetweenSingleQuotesIndexes(string str)
{
bool inSingleQuotes = false;
for(int i=0;i<str.Length;i++)
{
if (str[i] == '\'')
{
inSingleQuotes = !inSingleQuotes;
}
else if (str[i] == '+' && inSingleQuotes)
{
yield return i;
}
}
}
请注意,这些方法不会验证每个开头单引号是否有结束单引号。
修改强>
如果您有分隔引号,则只需检查前一个字符是否为\
之类的分隔符。
public static bool HasPlusBetweenSingleQuotes(string str)
{
bool inSingleQuotes = false;
char previous = ' '; // just defaulting to a space.
foreach (char c in str)
{
if (c == '\'' && previous != '\\')
{
inSingleQuotes = !inSingleQuotes;
}
else if (c == '+' && inSingleQuotes)
{
return true;
}
previous = c;
}
return false;
}
答案 1 :(得分:0)
我不确定这是否可以用正则表达式完成(可能会这样吗?)。如果你在引号之内或之外,用一个字符循环就可以更容易地做到这一点。
bool inBlock = false;
foreach(var aChar in string mySentence) {
//Testing with ascii codes + == +, ' == '
inBlock = (aChar == "'") ? !inBlock : inBlock;
if(inBlock && aChar == "+")
// do stuff here
}
作为一个注释,代码可能不起作用,我没有测试它。
答案 2 :(得分:0)
为什么不在这里反转逻辑并使用&#34;连接序列&#34;作为模式的结构?这些可以被描述为 + 或 + On + (带有可选空格)的序列,介于单引号(可能是非平衡的)之间字符串。匹配&#34;胶水&#34;由'
的lookbehind预览的序列和'
的预测,您可以将字符串解析为&#34;单引号字符串&#34;和#34;胶水&#34;令牌:
var strings = new string[]
{"'Name'+Code '+ On +'Sector'",
"'Name + R405' + '(Name)'",
"'Name + Code' + On + 'Sector'",
"'Name''+'Sector'"
};
const string pattern = @"(?<=')(\s*\+\s*|\s*\+\s*On\s*\+\s*)(?=')";
foreach (string s in strings)
{
Console.WriteLine("input:"+s);
string[] tokens = Regex.Split(s, pattern);
foreach (string token in tokens)
{
Console.WriteLine("token:->{0}<-", token);
}
//tokens.Where((x, i) => i % 2 == 0) //single quoted strings
//tokens.Where((x, i) => i % 2 != 0) //glue sequences
}