我对这个论坛很新。我在操作正确的字符串时遇到了麻烦。
基本上,我尝试做的是接收输入字符串,如下例所示:
str = "Say hello to=Stack overflow, Say goodbye to=other resources"
for question, answer in pairs(string.gmatch(s, "(%w+)=(%w+)"))
print(question, answer)
end
我希望它返回:问题="向"打招呼并回答="堆栈溢出,问题="告别"等等等等。但相反,它会在等号和紧随其后的单词之前拾取单词。我甚至尝试了*量词,它也做了同样的事情。 我也尝试过这种模式
[%w%s]*=[%w%s]
我只是希望能够将这个字符串排序到一个键值表中,其中键是每个=之前的所有单词,并且值是所有单词之后相等但在逗号之前。 有没有人有建议?
答案 0 :(得分:3)
您可以使用以下内容:
local str = "Say hello to=Stack overflow, Say goodbye to=other resources"
for question, answer in string.gmatch(str..",", "([^=]+)=([^,]+),%s*") do
print(question, answer)
end
"([^=]+)=([^,]+),%s*"
表示以下内容:除=
([^=]
)以外的任何内容(+
)重复一次或多次(=
)后跟[^=]+
,然后除&之外的任何内容#39;,',后跟逗号和可选空格(以避免在下一个问题中包含它们)。我还在字符串中添加了逗号,因此它也解析了最后一对。
在评论中对每个请求进一步详细说明:在表达式[=]
中,=
指定一个包含一个允许字符([^=]
)和=
的集合,因此除了+
和(.-)=(.-),%s*
允许该集重复1次或更多次之外,它设置为允许任何字符。
正如@lhf建议您可以使用更简单的表达式:=
,这意味着:取出所有字符,直到第一个-
(,
匹配非贪婪),然后全部使用第一个public static void main(String[] args){
Scanner input=null;
String[] line = new String[1];
line[0]="";
GetFile(input);
int count=ReadFile(input,line);
int[] year = new int[count];
int[] temperature = new int[count];
CreateArray(year,temperature,line);
PrintData(year,temperature);
}
public static void GetFile(Scanner input){
Scanner name = new Scanner(System.in);
boolean filefound=false;
while(!filefound){
try{
System.out.println("Enter The Name of File or File Path: ");
String filename = name.nextLine();
input = new Scanner(new File(filename));
filefound=true;
}catch(FileNotFoundException e){
System.out.println("Error: File Not Found");
System.out.println("");
}
}
}
public static int ReadFile(Scanner input, String[] line){
int count=0;
while(input.hasNextLine()){
line[0]=line[0] + input.nextLine()+" ";
count++;
}
return count;
}
public static void CreateArray(int[] year, int[] temperature, String[] line){
Scanner MakeArray = new Scanner(line[0]);
while(MakeArray.hasNext()){
int i= MakeArray.nextInt()-1;
year[i]=MakeArray.nextInt();
temperature[i]=MakeArray.nextInt();
}
}
public static void PrintData(int[] year, int[] temperature){
for(int i=0;i<year.length;i++)
System.out.println("("+year[i]+", "+temperature[i]+")");
}
//Here is my data
1 1950 11
2 1950 22
3 1950 65
4 1950 103
5 1950 99
6 1950 54
7 1950 109
8 1950 85
9 1950 72
10 1950 120
之前的字符。