万物基于MC
/          gamemode 0 "jdiajso ceqwjipj"
MC是如何准确的分割为
gamemode
0
jdiajso ceqwjipj
的?

3TUSK
Brigadier。
https://github.com/Mojang/brigadier

万物基于MC
感谢大佬助攻awa

万物基于MC
emmmm这个好像是一个库把,想要算法qwq

轻光233
微醉的阳光 发表于 2020-6-13 13:38
emmmm这个好像是一个库把,想要算法qwq

参见java.lang.String

万物基于MC
用空格来分割文本吗

南柯郡守
微醉的阳光 发表于 2020-6-13 13:44
用空格来分割文本吗
  1. String[] args = cmd.replace("/","").split(" ");
复制代码

就这样

轻光233
微醉的阳光 发表于 2020-6-13 13:44
用空格来分割文本吗

如果不是我论坛挂着我就看不到你回复了(
请善用回复

是的,用空格来分割,你可以把带""的一段切出来换成没有空格的随机字符,然后用空格分隔,再把随机字符替换成原先的内容

万物基于MC

但这样不会出现很多个数组吗
比如
/            gamemode 1

南柯郡守
微醉的阳光 发表于 2020-6-13 13:49
但这样不会出现很多个数组吗
比如
/            gamemode 1

参阅 这里

万物基于MC
轻光233 发表于 2020-6-13 13:48
如果不是我论坛挂着我就看不到你回复了(
请善用回复

那么名字该如何判定
"test aaaaaa"
会分割成
"test,aaaaaa"

轻光233
微醉的阳光 发表于 2020-6-13 13:49
但这样不会出现很多个数组吗
比如
/            gamemode 1

但凡你能继续看javase api教程。。。
只会出现一个数组,详见百度

万物基于MC
轻光233 发表于 2020-6-13 13:54
但凡你能继续看javase api教程。。。
只会出现一个数组,详见百度

那么名字该如何判定
"test aaaaaa"
会分割成
"test,aaaaaa"

RE_OVO
用正则表达式分割
  1. split("\\s+")
复制代码

万物基于MC
本帖最后由 微醉的阳光 于 2020-6-13 14:02 编辑
jebme 发表于 2020-6-13 13:56
用正则表达式分割

感谢大佬

轻光233
微醉的阳光 发表于 2020-6-13 13:54
那么名字该如何判定
"test aaaaaa"
会分割成

看我说了什么。。。
先把有引号的替换掉
for,charAt找到两个引号的位置,然后获取,替换
我写一段吧
  1. String str = "/aaa sacvs "aa aa"";
  2.                 String temp = "andxobfgbvrfd";
  3.                 str = str.replace("/", "");
  4.                 int start = -1;
  5.                 int over = -1;
  6.                 for(int i = 0;i < str.length();i++) {
  7.                         if(str.charAt(i) == '"') {
  8.                                 if(start == -1) {
  9.                                         start = i;
  10.                                 }else {
  11.                                         over = i;
  12.                                 }
  13.                         }
  14.                 }
  15.                
  16.                 if(start != -1 && over != -1) {
  17.                         String sub = str.substring(start,over + 1);
  18.                         str = str.replace(sub, temp);
  19.                         String[] split = str.split(" ");
  20.                         for(int i = 0; i < split.length;i++) {
  21.                                 if(split[i].equals(temp)) {
  22.                                         split[i] = sub;
  23.                                 }
  24.                         }
  25.                         System.out.println(Arrays.toString(split));
  26.                 }
复制代码

南柯郡守
轻光233 发表于 2020-6-13 14:04
看我说了什么。。。
先把有引号的替换掉
for,charAt找到两个引号的位置,然后获取,替换

推荐使用String 的 indexOf() 和 lastIndexOf()

轻光233
本帖最后由 轻光233 于 2020-6-13 14:10 编辑
南柯郡守 发表于 2020-6-13 14:07
推荐使用String 的 indexOf() 和 lastIndexOf()

确实,这样会更快一点
但是如果引号的对数多一点,还是要换成charAt判断相等(

轻光233


南柯郡守

我的意思是你这个方法等价于 lastIndexOf()

如果arg里面出现三个 " 或者更多的 "  那么你的over的值也是最后一个引号的值  而不是中间的第二个
那么lastIndexOf("\"")的值也是最后一个的值

轻光233
南柯郡守 发表于 2020-6-13 14:26
我的意思是你这个方法等价于 lastIndexOf()

如果arg里面出现三个 " 或者更多的 "  那么你的over的值也是 ...

我也没说不用改(
他如果要的话我再改吧

3TUSK
微醉的阳光 发表于 2020-6-13 13:38
emmmm这个好像是一个库把,想要算法qwq

为什么在有现成的库的时候跑去自己造轮子?

万物基于MC
因为用的不是java

3TUSK

https://github.com/Mojang/brigad ... r/StringReader.java

Brigadier 大致是用这个 tokenize string 的。

Ref
https://github.com/Mojang/brigad ... ispatcher.java#L364