Как проверить Character на то, что это знак препинания
Как проверить на то что char является знаком препинания в java?
Ответы (4 шт):
Автор решения: geo
→ Ссылка
import java.util.regex.*;
class Punct{
static Pattern p = Pattern.compile("\\p{Punct}"); //template
public static boolean punct(char ch){
Matcher m = p.matcher(Character.toString(ch)); //String char punctuation
return m.find();
}
}
public class task1610753 {
public static void main(String[] args){
System.out.println(Punct.punct(','));
System.out.println(Punct.punct('.'));
System.out.println(Punct.punct('a'));
}
}
Автор решения: Qwertiy
→ Ссылка
public class Main {
public static boolean isPunctuation(char c) {
int t = Character.getType(c);
return t == Character.CONNECTOR_PUNCTUATION
|| t == Character.DASH_PUNCTUATION
|| t == Character.END_PUNCTUATION
|| t == Character.FINAL_QUOTE_PUNCTUATION
|| t == Character.INITIAL_QUOTE_PUNCTUATION
|| t == Character.OTHER_PUNCTUATION
|| t == Character.START_PUNCTUATION;
}
public static void main(String[] args) {
String s = "Hello, World!";
for (int q=0; q<s.length(); ++q) {
char c = s.charAt(q);
if (isPunctuation(c)) {
System.out.print(c);
}
}
}
}
Автор решения: Pak Uula
→ Ссылка
Я очень извиняюсь за дурацкий вопрос, но что вы называете "знаком препинания"?
Если посмотреть стандарт Юникода, то там разных категорий PUNTUATION семь штук:
- Pc Connector Punctuation
- Pd Dash Punctuation
- Ps Open Punctuation
- Pe Close Punctuation
- Pi Initial Punctuation
- Pf Final Punctuation
- Po Other Punctuation
Метод Character.getType(char) возвращает цифровой код категории, к которой относится символ. Вот небольшой пример, который печатает, к какой категории пунктуации относится символ.
import java.util.Map;
class Main {
static final Map<Byte,String> unicodePunctuationClassName = Map.of(
Character.DASH_PUNCTUATION, "DASH_PUNCTUATION",
Character.START_PUNCTUATION, "START_PUNCTUATION",
Character.END_PUNCTUATION, "END_PUNCTUATION",
Character.CONNECTOR_PUNCTUATION, "CONNECTOR_PUNCTUATION",
Character.OTHER_PUNCTUATION, "OTHER_PUNCTUATION",
Character.INITIAL_QUOTE_PUNCTUATION, "INITIAL_QUOTE_PUNCTUATION",
Character.FINAL_QUOTE_PUNCTUATION, "FINAL_QUOTE_PUNCTUATION"
);
static boolean IsUnicodePunctuation(char c) {
byte cls = (byte) Character.getType(c);
return unicodePunctuationClassName.containsKey(cls);
}
public static void main(String[] args) {
String s = "aБ,./`!?-—«»‼⁉";
for (var c : s.toCharArray()) {
byte cls = (byte) Character.getType(c);
if (unicodePunctuationClassName.containsKey(cls)) {
System.out.print(c + " - " + unicodePunctuationClassName.get(cls));
} else {
System.out.print(c + " - " + cls);
}
System.out.println(" (isUnicodePunctuation: " + IsUnicodePunctuation(c) + ")");
}
}
}
Результат
a - 2 (isUnicodePunctuation: false)
Б - 1 (isUnicodePunctuation: false)
, - OTHER_PUNCTUATION (isUnicodePunctuation: true)
. - OTHER_PUNCTUATION (isUnicodePunctuation: true)
/ - OTHER_PUNCTUATION (isUnicodePunctuation: true)
` - 27 (isUnicodePunctuation: false)
! - OTHER_PUNCTUATION (isUnicodePunctuation: true)
? - OTHER_PUNCTUATION (isUnicodePunctuation: true)
- - DASH_PUNCTUATION (isUnicodePunctuation: true)
— - DASH_PUNCTUATION (isUnicodePunctuation: true)
« - INITIAL_QUOTE_PUNCTUATION (isUnicodePunctuation: true)
» - FINAL_QUOTE_PUNCTUATION (isUnicodePunctuation: true)
‼ - OTHER_PUNCTUATION (isUnicodePunctuation: true)
⁉ - OTHER_PUNCTUATION (isUnicodePunctuation: true)
Вам подходит?
Кстати, регулярное выражение \\p{IsPunctuation} из других ответов устроено точно так же - символ соответствует этому выражению, если он относится к одной из этих семи категорий.
Автор решения: вячесlove
→ Ссылка
public static boolean isPrepin(char ch) {
String PREPIN = ",./;"; // знаки препинания
return PREPIN.indexOf(ch) != -1;
}